- import java.io.BufferedReader; 
- import java.io.IOException; 
- import java.io.InputStreamReader; 
- import java.util.ArrayList; 
- import java.util.HashMap; 
- import java.util.Iterator; 
- import java.util.List; 
- import java.util.Map; 
- import java.util.StringTokenizer; 
-   
-   
- public class Main 
- { 
-   
- 	public static class city 
- 	{ 
- 		city next; 
- 		int val; 
-   
- 		{ 
- 			c1 = a; 
- 			val = v; 
- 			next = null; 
- 		} 
- 	} 
-   
- 	static int T,tot,x,cost,ans; 
- 	static-  HashMap <String- ,city >-  map  = new-  HashMap <String- ,city >();
 
- 	static-  HashMap <String- ,Integer >-  head  = new-  HashMap <String- ,Integer >();
 
- 	static List<String> sol = new ArrayList<String>(); 
-   
- 	{ 
- 		T  = Integer- . parseInt(- br. readLine());
-   
- 		while(T-- >0) 
- 		{ 
- 			tot  = Integer- . parseInt(- br. readLine());
- 			tot--; 
-   
- 			cost = ans = 0; 
-   
- 			if(- tot ==0) System- . out- . println("0$");
 
- 			else 
- 			{ 
- 			for(x=0;x<tot;x++) 
- 			{ 
-   
- 				city1 = t.nextToken(); 
- 				city2 = t.nextToken(); 
- 				ans += cost; 
-   
-   
- 				map.put(city1, new city(city1,-1)); 
-   
- 				if(map.containsKey(city2))	map.get(city2).val = cost; 
- 				else	map.put(city2, new city(city2,cost)); 
-   
- 				map.get(city1).next = map.get(city2); 
-   
- 				if(!head.containsKey(city1)) head.put(city1, 1); 
- 				head.put(city2, 2); 
-   
-   
- 			} 
-   
- 		    Iterator-  it  =-  head. entrySet()- . iterator();
 
- 		    while (it.hasNext())  
- 		    { 
-   
- 		        { 
- 		        	start  = (String) (- pairs. getKey());
- 		        	break; 
- 		        } 
- 		    } 
-   
- 		    for(x=0;x<tot;x++) 
- 		    { 
- 		    	if(map.get(start).next!=null) 
- 		    	{	 
- 		    		sol.add(start+" "+map.get(start).next.c1+" "+map.get(start).next.val+"$"); 
- 		    		start = map.get(start).next.c1; 
- 		    	}	 
- 		    }	 
- 		    sol.add(ans+"$"); 
- 		} 
- 		for(- x =0;- x <- sol. size();- x ++) System- . out- . println(- sol. get(- x ));
 
- 	} 
- }} 
				aW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CmltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwppbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKaW1wb3J0IGphdmEudXRpbC5MaXN0OwppbXBvcnQgamF2YS51dGlsLk1hcDsKaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CgoKcHVibGljIGNsYXNzIE1haW4KewogICAgCglwdWJsaWMgc3RhdGljIGNsYXNzIGNpdHkKCXsKCQlTdHJpbmcgYzE7CgkJY2l0eSBuZXh0OwoJCWludCB2YWw7CgkJCgkJcHVibGljIGNpdHkoU3RyaW5nIGEsaW50IHYpCgkJewoJCQljMSA9IGE7CgkJCXZhbCA9IHY7CgkJCW5leHQgPSBudWxsOwoJCX0KCX0KCQoJc3RhdGljIEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihTeXN0ZW0uaW4pKTsKCXN0YXRpYyBpbnQgVCx0b3QseCxjb3N0LGFuczsKCXN0YXRpYyBTdHJpbmdUb2tlbml6ZXIgdDsKCXN0YXRpYyBTdHJpbmcgY2l0eTEsY2l0eTI7CglzdGF0aWMgSGFzaE1hcDxTdHJpbmcsY2l0eT4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLGNpdHk+KCk7IAoJc3RhdGljIEhhc2hNYXA8U3RyaW5nLEludGVnZXI+IGhlYWQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsSW50ZWdlcj4oKTsgCglzdGF0aWMgTGlzdDxTdHJpbmc+IHNvbCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwoJCglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiAKCXsKCQlUID0gSW50ZWdlci5wYXJzZUludChici5yZWFkTGluZSgpKTsKCQkKCQl3aGlsZShULS0gPjApCgkJewoJCQl0b3QgPSBJbnRlZ2VyLnBhcnNlSW50KGJyLnJlYWRMaW5lKCkpOwoJCQl0b3QtLTsKCQkJCQkKCQkJY29zdCA9IGFucyA9IDA7CgkJCQoJCQlpZih0b3Q9PTApIFN5c3RlbS5vdXQucHJpbnRsbigiMCQiKTsKCQkJZWxzZQoJCQl7CgkJCWZvcih4PTA7eDx0b3Q7eCsrKQoJCQl7CgkJCQl0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihici5yZWFkTGluZSgpKTsKCQkJCQoJCQkJY2l0eTEgPSB0Lm5leHRUb2tlbigpOwoJCQkJY2l0eTIgPSB0Lm5leHRUb2tlbigpOwoJCQkJY29zdCA9IEludGVnZXIucGFyc2VJbnQobmV3IFN0cmluZ1Rva2VuaXplcih0Lm5leHRUb2tlbigpLCIkIikubmV4dFRva2VuKCkpOwoJCQkJYW5zICs9IGNvc3Q7CgkJCQkKCQkJCQoJCQkJbWFwLnB1dChjaXR5MSwgbmV3IGNpdHkoY2l0eTEsLTEpKTsKCQkJCQkJCgkJCQlpZihtYXAuY29udGFpbnNLZXkoY2l0eTIpKQltYXAuZ2V0KGNpdHkyKS52YWwgPSBjb3N0OwoJCQkJZWxzZQltYXAucHV0KGNpdHkyLCBuZXcgY2l0eShjaXR5Mixjb3N0KSk7CgoJCQkJbWFwLmdldChjaXR5MSkubmV4dCA9IG1hcC5nZXQoY2l0eTIpOwoKCQkJCWlmKCFoZWFkLmNvbnRhaW5zS2V5KGNpdHkxKSkgaGVhZC5wdXQoY2l0eTEsIDEpOwoJCQkJaGVhZC5wdXQoY2l0eTIsIDIpOwoJCQkJCQkJCQoJCQkJCQkJCQoJCQl9CgkJCQoJCQlTdHJpbmcgc3RhcnQgPSBudWxsOwoJCSAgICBJdGVyYXRvciBpdCA9IGhlYWQuZW50cnlTZXQoKS5pdGVyYXRvcigpOwoJCSAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSAKCQkgICAgewoJCSAgICAgICAgTWFwLkVudHJ5IHBhaXJzID0gKE1hcC5FbnRyeSlpdC5uZXh0KCk7CgkJICAgICAgICAKCQkgICAgICAgIGlmKChJbnRlZ2VyKXBhaXJzLmdldFZhbHVlKCk9PTEpIAoJCSAgICAgICAgewoJCSAgICAgICAgCXN0YXJ0ID0gKFN0cmluZykgKHBhaXJzLmdldEtleSgpKTsKCQkgICAgICAgIAlicmVhazsKCQkgICAgICAgIH0KCQkgICAgfQoKCQkgICAgZm9yKHg9MDt4PHRvdDt4KyspCgkJICAgIHsKCQkgICAgCWlmKG1hcC5nZXQoc3RhcnQpLm5leHQhPW51bGwpCgkJICAgIAl7CQoJCSAgICAJCXNvbC5hZGQoc3RhcnQrIiAiK21hcC5nZXQoc3RhcnQpLm5leHQuYzErIiAiK21hcC5nZXQoc3RhcnQpLm5leHQudmFsKyIkIik7CgkJICAgIAkJc3RhcnQgPSBtYXAuZ2V0KHN0YXJ0KS5uZXh0LmMxOwoJCSAgICAJfQkKCQkgICAgfQkKCQkgICAgc29sLmFkZChhbnMrIiQiKTsKCQl9CgkJZm9yKHg9MDt4PHNvbC5zaXplKCk7eCsrKSBTeXN0ZW0ub3V0LnByaW50bG4oc29sLmdldCh4KSk7Cgl9Cn19