- import java.io.BufferedReader; 
- import java.io.InputStreamReader; 
- import java.util.HashMap; 
- import java.util.HashSet; 
- import java.util.Map; 
- import java.util.Set; 
-   
- class Traveling { 
-   
-     private static final int INPUT_LEN = 2 + 2 + 10 * (4 + 2 + 5000 * (50 + 1 + 50 + 1 + 5 + 2)); 
-   
- 		int-  T  = Integer- . parseInt(- br. readLine());
 
- 		Map <String- , String >-  fromMap  = new-  HashMap <String- , String >();
- 		Map <String- , String >-  fromPriceMap  = new-  HashMap <String- , String >();
- 		Set<String> toMap = new HashSet<String>(); 
- 		StringBuilder buff = new StringBuilder(); 
- 		while (T-- > 0) { 
- 			int-  N  = Integer- . parseInt(- br. readLine());
 
- 			long sum = 0; 
- 			{ // solve test case 
- 				fromMap.clear(); 
- 				toMap.clear(); 
- 				while (--N > 0) { 
- 					String[]-  parts  =-  br. readLine()- . split(" ");
 
- 					fromMap.put(parts[0], parts[1]); 
- 					fromPriceMap.put(parts[0], parts[2]); 
- 					toMap.add(parts[1]); 
- 					sum += parse(parts[2]); 
- 				} 
- 				// get first 
- 				Set<String> firstSet = new HashSet<String>(fromMap.keySet()); 
- 				firstSet.removeAll(toMap); 
- 				String-  from  =-  firstSet. iterator()- . next();
 
- 				// iterate and print 
- 				buff.setLength(0); 
- 				String-  next  =-  fromMap. get(- from );
 
- 				while (next != null) { 
- 					buff.append(from).append(' ').append(next).append(' ').append(fromPriceMap.get(from)).append('\n'); 
- 					from = next; 
- 					next = fromMap.get(from); 
- 				} 
- 				buff.append(sum).append("$\n"); 
- 				System- . out- . println(- buff. toString());
 
- 			} 
- 		} 
- 	} 
-   
- 	private static long-  parse (String-  price ) {
 
- 		return Integer- . parseInt(- price. substring(0- , price. length() - 1));
 
- 	} 
- } 
				aW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CmltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwppbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CmltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKaW1wb3J0IGphdmEudXRpbC5NYXA7CmltcG9ydCBqYXZhLnV0aWwuU2V0OwoKY2xhc3MgVHJhdmVsaW5nIHsKCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5QVVRfTEVOID0gMiArIDIgKyAxMCAqICg0ICsgMiArIDUwMDAgKiAoNTAgKyAxICsgNTAgKyAxICsgNSArIDIpKTsKCglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKCQlCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoU3lzdGVtLmluKSwgSU5QVVRfTEVOKTsKCQlpbnQgVCA9IEludGVnZXIucGFyc2VJbnQoYnIucmVhZExpbmUoKSk7CgkJTWFwPFN0cmluZywgU3RyaW5nPiBmcm9tTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CgkJTWFwPFN0cmluZywgU3RyaW5nPiBmcm9tUHJpY2VNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKCQlTZXQ8U3RyaW5nPiB0b01hcCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKCQlTdHJpbmdCdWlsZGVyIGJ1ZmYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwoJCXdoaWxlIChULS0gPiAwKSB7CgkJCWludCBOID0gSW50ZWdlci5wYXJzZUludChici5yZWFkTGluZSgpKTsKCQkJbG9uZyBzdW0gPSAwOwoJCQl7IC8vIHNvbHZlIHRlc3QgY2FzZQoJCQkJZnJvbU1hcC5jbGVhcigpOwoJCQkJdG9NYXAuY2xlYXIoKTsKCQkJCXdoaWxlICgtLU4gPiAwKSB7CgkJCQkJU3RyaW5nW10gcGFydHMgPSBici5yZWFkTGluZSgpLnNwbGl0KCIgIik7CgkJCQkJZnJvbU1hcC5wdXQocGFydHNbMF0sIHBhcnRzWzFdKTsKCQkJCQlmcm9tUHJpY2VNYXAucHV0KHBhcnRzWzBdLCBwYXJ0c1syXSk7CgkJCQkJdG9NYXAuYWRkKHBhcnRzWzFdKTsKCQkJCQlzdW0gKz0gcGFyc2UocGFydHNbMl0pOwoJCQkJfQoJCQkJLy8gZ2V0IGZpcnN0CgkJCQlTZXQ8U3RyaW5nPiBmaXJzdFNldCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oZnJvbU1hcC5rZXlTZXQoKSk7CgkJCQlmaXJzdFNldC5yZW1vdmVBbGwodG9NYXApOwoJCQkJU3RyaW5nIGZyb20gPSBmaXJzdFNldC5pdGVyYXRvcigpLm5leHQoKTsKCQkJCS8vIGl0ZXJhdGUgYW5kIHByaW50CgkJCQlidWZmLnNldExlbmd0aCgwKTsKCQkJCVN0cmluZyBuZXh0ID0gZnJvbU1hcC5nZXQoZnJvbSk7CgkJCQl3aGlsZSAobmV4dCAhPSBudWxsKSB7CgkJCQkJYnVmZi5hcHBlbmQoZnJvbSkuYXBwZW5kKCcgJykuYXBwZW5kKG5leHQpLmFwcGVuZCgnICcpLmFwcGVuZChmcm9tUHJpY2VNYXAuZ2V0KGZyb20pKS5hcHBlbmQoJ1xuJyk7CgkJCQkJZnJvbSA9IG5leHQ7CgkJCQkJbmV4dCA9IGZyb21NYXAuZ2V0KGZyb20pOwoJCQkJfQoJCQkJYnVmZi5hcHBlbmQoc3VtKS5hcHBlbmQoIiRcbiIpOwoJCQkJU3lzdGVtLm91dC5wcmludGxuKGJ1ZmYudG9TdHJpbmcoKSk7CgkJCX0KCQl9Cgl9CgoJcHJpdmF0ZSBzdGF0aWMgbG9uZyBwYXJzZShTdHJpbmcgcHJpY2UpIHsKCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludChwcmljZS5zdWJzdHJpbmcoMCwgcHJpY2UubGVuZ3RoKCkgLSAxKSk7Cgl9Cn0=