package com.test;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class TestService {
 static Map<String, String> mapN = new HashMap<String, String>();
 static int max_depth = 0;
 public static void main(String[] args) {
  List<List<String>> data = getData();
  System.out.println(data);
  Map<String, List<String>> mapP = new HashMap<String, List<String>>();
  
  for (int i = 0; i < data.size(); i++) {
   List<String> rows = data.get(i);
   if(mapP.get(rows.get(2)) != null){
    List<String> listC = mapP.get(rows.get(2));
    listC.add(rows.get(0));
    mapN.put(rows.get(0), rows.get(1));
   } else {
    List<String> listC = new ArrayList<String>();
    listC.add(rows.get(0));
    mapN.put(rows.get(0), rows.get(1));
    mapP.put(rows.get(2), listC);
   }
  }
  List<List<String>> level_list = new ArrayList<List<String>>();
  List<List<String>> final_list = new ArrayList<List<String>>();
  List<String> first_level = mapP.get("0");
  List<String> this_level_list = new ArrayList<>();
  loopingLowerLevel(first_level, mapP, 1, level_list, this_level_list);
  for(int i = 0; i < level_list.size(); i++){
   List<String> list = level_list.get(i);
   for(int j = 0; j < max_depth; j++){
    if(j >= list.size()){
     if(i == 0){
      List<String> list_d = new ArrayList<>();
      list_d.add("");
      final_list.add(list_d);
     } else {
      List<String> list_dd = final_list.get(j);
      list_dd.add("");
      final_list.set(j, list_dd);
     }
    } else {
     if(i == 0){
      List<String> list_d = new ArrayList<>();
      list_d.add(list.get(j));
      final_list.add(list_d);
     } else {
      List<String> list_dd = final_list.get(j);
      list_dd.add(list.get(j));
      final_list.set(j, list_dd);
     }
    }
    }
  }
  for(int finall = 0; finall < final_list.size(); finall++){
   System.out.println(final_list.get(finall));
  }
 }
 
 private static void loopingLowerLevel(List<String> low_level_list, Map<String, List<String>> mapP, int level, List<List<String>> level_list, List<String> tree){
  for(int i = 0; i < low_level_list.size(); i++){
   List<String> another_level_list = mapP.get(low_level_list.get(i));
   List<String> this_level_list = new ArrayList<>(tree);
   this_level_list.add(mapN.get(low_level_list.get(i)));
   if(another_level_list != null){
    loopingLowerLevel(another_level_list, mapP, (level+1), level_list, this_level_list);
   } else {
    level_list.add(this_level_list);
    if(level > max_depth)
     max_depth = level;
   }
  }
 }
 
 /*private static int loopingLowerLevel(List<String> low_level_list, Map<String, List<String>> mapP, String parent, int level, List<List<String>> level_list){
  for(int i = 0; i < low_level_list.size(); i++){
   List<String> another_level_list = mapP.get(low_level_list.get(i));
   if(level_list.size() > level) {
    List<String> list_p = level_list.get(level);
    list_p.add(mapN.get(low_level_list.get(i)));
    level_list.add(level, list_p);
   } else {
    List<String> list_p = new ArrayList<String>();
    list_p.add(mapN.get(low_level_list.get(i)));
    level_list.add(level, list_p);
   }
   if(another_level_list != null){
    int rtnLevel = loopingLowerLevel(another_level_list, mapP, low_level_list.get(i), level++, level_list);
    
   } else {
    
   }
  }
  
 }*/
 
 
 private static List<List<String>> getData(){
  List<List<String>> data = new ArrayList<List<String>>();
  
  List<String> dataRow = new ArrayList<String>();
  dataRow.add("1");
  dataRow.add("A");
  dataRow.add("0");
 
  dataRow.add("");
  data.add(dataRow);
  
  dataRow = new ArrayList<String>();
  dataRow.add("2");
  dataRow.add("B");
  dataRow.add("1");
  dataRow.add("");
  data.add(dataRow);
  
  dataRow = new ArrayList<String>();
  dataRow.add("3");
  dataRow.add("C");
  dataRow.add("1");
 
  dataRow.add("");
  data.add(dataRow);
  
  dataRow = new ArrayList<String>();
  dataRow.add("4");
  dataRow.add("D");
  dataRow.add("2");
 
  dataRow.add("");
  data.add(dataRow);
  
  dataRow = new ArrayList<String>();
  dataRow.add("5");
  dataRow.add("E");
  dataRow.add("2");
  dataRow.add("");
  data.add(dataRow);
  
  dataRow = new ArrayList<String>();
  dataRow.add("6");
  dataRow.add("F");
  dataRow.add("3");
  dataRow.add("");
  data.add(dataRow);
  
  dataRow = new ArrayList<String>();
  dataRow.add("7");
  dataRow.add("G");
  dataRow.add("3");
  dataRow.add("");
  data.add(dataRow);
  
  return data;
 }
}