//Kruskal 直接套的模板
#include<stdio.h>
#include<algorithm>
using namespace std;
typedef struct
{
int x,y,w;
}Edge;
Edge edge[30*30];
int edgenum,minCost,n;
int father[30];
void makeset()
{
int i;
for(i=0;i<=n;i++)
father[i]=i;
return ;
}
bool cmp(Edge e1, Edge e2) // 边排序
{
return e1.w<e2.w;
}
int findfather(int x)
{
if(x!=father[x])
father[x]=findfather(father[x]);
return father[x];
}
void unionSet(int x,int y)
{
father[x]=y;
return ;
}
void krustal()
{
int i,fa,fb;
makeset();
sort(edge,edge+edgenum,cmp);
for(i=0;i<edgenum;i++)
{
fa=findfather(edge[i].x);
fb=findfather(edge[i].y);
if(fa!=fb)
{
unionSet(fa,fb);
minCost+=edge[i].w;
}
}
return ;
}
int main()
{
int i,j,k,cost;
char v1[5],v2[5];
while(scanf("%d",&n) && n)
{
edgenum=0;
for(i=0;i<n-1;i++)
{
scanf("%s%d",v1,&k);
for(j=0;j<k;j++)
{
scanf("%s%d",v2,&cost);
edge[edgenum].x=v1[0]-'A';
edge[edgenum].y=v2[0]-'A';
edge[edgenum++].w=cost;
}
}
minCost=0;
krustal();
printf("%d\n",minCost);
}
return 0;
}