#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int pa[900],rank1[900];
int ans;
typedef struct{
int u,v,c;
}edge;
edge e[900];
bool cmp(const edge& e1,const edge& e2){
return e1.c<e2.c;
}
void make(int x){
pa[x]=x;
rank1[x]=0;
}
int findd(int x){
if(x!=pa[x])
pa[x]=findd(pa[x]);
return pa[x];
}
void unite(int x,int y,int w){
x=findd(x);
y=findd(y);
if(x==y)
return ;
ans+=w;
if(rank1[x]<rank1[y])
pa[x]=y;
else{
pa[y]=x;
if(rank1[x]==rank1[y])
rank1[x]++;
}
}
int main(){
int n;
char a,b;
int m;
int k=0;
while(scanf("%d",&n)&&n){
ans=0;
k=0;
for(int i=1;i<=(n-1);i++){
getchar();
scanf("%c",&a);
//getchar();
scanf("%d",&m);
for(int j=0;j<m;j++){
getchar();
scanf("%c",&b);
e[k].u=i;
e[k].v=b-'A'+1;
scanf("%d",&e[k++].c);
}
}
for(int i=1;i<=n;i++){
make(i);
}
sort(e,e+k,cmp);
for(int i=0;i<k;i++){
int x=findd(e[i].u);
int y=findd(e[i].v);
if(x!=y)
unite(x,y,e[i].c);
}printf("%d\n",ans);
}
return 0;
}
#include <cstring>
#include <algorithm>
using namespace std;
int pa[900],rank1[900];
int ans;
typedef struct{
int u,v,c;
}edge;
edge e[900];
bool cmp(const edge& e1,const edge& e2){
return e1.c<e2.c;
}
void make(int x){
pa[x]=x;
rank1[x]=0;
}
int findd(int x){
if(x!=pa[x])
pa[x]=findd(pa[x]);
return pa[x];
}
void unite(int x,int y,int w){
x=findd(x);
y=findd(y);
if(x==y)
return ;
ans+=w;
if(rank1[x]<rank1[y])
pa[x]=y;
else{
pa[y]=x;
if(rank1[x]==rank1[y])
rank1[x]++;
}
}
int main(){
int n;
char a,b;
int m;
int k=0;
while(scanf("%d",&n)&&n){
ans=0;
k=0;
for(int i=1;i<=(n-1);i++){
getchar();
scanf("%c",&a);
//getchar();
scanf("%d",&m);
for(int j=0;j<m;j++){
getchar();
scanf("%c",&b);
e[k].u=i;
e[k].v=b-'A'+1;
scanf("%d",&e[k++].c);
}
}
for(int i=1;i<=n;i++){
make(i);
}
sort(e,e+k,cmp);
for(int i=0;i<k;i++){
int x=findd(e[i].u);
int y=findd(e[i].v);
if(x!=y)
unite(x,y,e[i].c);
}printf("%d\n",ans);
}
return 0;
}