#include <stdio.h> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int maxn=101; struct edge { int from,to,w,next; } e[maxn<<1]; int f[maxn]; int t; void add(int i,int j,int w) { e[t].from=i; e[t].to=j; e[t].w=w; t++; } bool cmp(struct edge a,struct edge b) { if(a.w!=b.w) return a.w<b.w; } int find(int x) { if(x!=f[x]) f[x]=find(f[x]); return f[x]; } void un(int x,int y) { x=find(x); y=find(y); if(x==y) return ; f[y]=x; } int main() { int n,num,d; char c,city; while(scanf("%d",&n)==1 && n) { t=1; memset(e,0,sizeof(e)); for(int i=1; i<n; i++) { cin >> c >> num; while(num--) { cin >> city >> d; add(c-'A'+1,city-'A'+1,d); } } for(int i=1; i<=n; i++) f[i]=i; sort(e+1,e+t+1,cmp); int ans=0,x,y; for(int i=1; i<=t; i++) { x=find(e[i].from); y=find(e[i].to); if(x!=y) un(x,y),ans+=e[i].w; } printf("%d\n",ans); } return 0; }