#include <bits/stdc++.h> using namespace std; struct Edge { int a; int b; int weigh; Edge(char _a, char _b, int _weigh) { a = _a - 'A'; b = _b - 'A'; weigh = _weigh; } }; bool operator<(Edge lhs, Edge rhs) { return lhs.weigh < rhs.weigh; } int father[100]; int height[100]; void InitSet(int n) { for (int i = 0; i < n; ++i) { father[i] = i; height[i] = 0; } } int FindFather(int u) { if (u == father[u]) { return father[u]; } else { father[u] = FindFather(father[u]); return father[u]; } } void UnionSet(int u, int v) { int u_root = FindFather(u); int v_root = FindFather(v); if (height[u_root] > height[v_root]) { father[v_root] = u_root; } else if (height[v_root] > height[u_root]) { father[u_root] = v_root; } else { father[v_root] = u_root; ++height[u_root]; } } int Kruskal(int n, vector<Edge> &edgeVec) { InitSet(n); int sum = 0; int edgeNum = 0; sort(edgeVec.begin(), edgeVec.end()); for (int i = 0; i < edgeVec.size(); ++i) { Edge a = edgeVec[i]; if (FindFather(a.a) != FindFather(a.b)) { UnionSet(a.a, a.b); edgeNum++; sum += a.weigh; if (edgeNum == n - 1) { break; } } } return sum; } int main() { int n;//村庄的个数 while (scanf("%d", &n) != EOF) { if (0 == n) { return 0; } vector<Edge> edgeVec; for (int i = 0; i < n - 1; ++i) { char a; cin >> a; int m; scanf("%d", &m); for (int j = 0; j < m; ++j) { char b; cin >> b; int weigh; scanf("%d", &weigh); Edge e(a, b, weigh); edgeVec.push_back(e); } } printf("%d\n", Kruskal(n, edgeVec)); } return 0; }