#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;
//最小生成树 并查集
struct nod{
int jl;
char x;
char y;
};
bool cmp(nod a, nod b)
{
return a.jl<b.jl;
}
map<char,char> fa;//并查集
char find(char x)
{
while(fa[x]!=x)
{
x=fa[x];
}
return x;
}
int main()
{
while(1)
{
int n;
cin>>n;
if(n==0)
{
break;
}
vector<nod> ve;
for(int o=0;o<(n-1);o++)
{
char a;
int m;
cin>>a>>m;
for(int i=0;i<m;i++)
{
char b;
int len;
cin>>b>>len;
nod t;
t.x=a;
t.y=b;
t.jl=len;
ve.push_back(t);
}
}
sort(ve.begin(),ve.end(),cmp);
fa.clear();
for(int i=0;i<26;i++)
{
fa['A'+i]=(char)('A'+i);
}
int jg=0;
for(int i=0;i<ve.size();i++)
{
char tx=ve[i].x;
char ty=ve[i].y;
if(find(tx)!=find(ty))
{
//cout<<find(tx)<<" "<<find(ty)<<endl;
//cout<<(char)tx<<" "<<(char)ty<<" "<<ve[i].jl<<endl;
fa[find(tx)]=find(ty);
//cout<<find(tx)<<" "<<find(ty)<<endl<<endl;
jg=jg+ve[i].jl;
}
}
cout<<jg<<endl;
}
return 0;
}