#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <queue>
#include <vector>
using namespace std;
const int maxn=30;
int father[maxn];
int height[maxn];
bool isCpt(char x){
if(x>='A' && x<='Z') return true;
else return false;
}
struct edge{
int from;
int to;
int length;
edge(char x,char y,int c){
from=x-'A';
to=y-'A';
length=c;
}
bool operator< (edge b) const{
return length>b.length;
}
};
priority_queue<edge> q;
void init(){
for(int i=0;i<maxn;i++){
father[i]=i;
height[i]=0;
}
while(!q.empty()) q.pop();
}
int findf(int x){
if(x!=father[x]) father[x]=findf(father[x]);
return father[x];
}
void Union(int x,int y){
x=findf(x);
y=findf(y);
if(x!=y){
if(height[x]>height[y]) father[y]=x;
else if(height[x]<height[y]) father[x]=y;
else{
father[y]=x;
height[x]++;
}
}
}
int numberin(string x,int& i){
int r=0;
while(x[i]!=' '&& i<x.length()){
r=r*10+x[i]-'0';
i++;
}
return r;
}
int main() {
int n;
while(cin>>n && n!=0){
init();
getchar();
while(n>1){
queue<char> tc;
queue<int> ti;
string x;
getline(cin, x);
char from=x[0];
for(int i=1;i<x.length();i++){
if(x[i]==' ') continue;
else if(isCpt(x[i])) {
tc.push(x[i]);
}
else ti.push(numberin(x,i));
}
ti.pop();
while(!tc.empty()){
q.push(edge(from,tc.front(),ti.front()));
tc.pop();
ti.pop();
}
n--;
}
int cost=0;
while(!q.empty()){
edge e=q.top();
q.pop();
if(findf(e.from)==findf(e.to)) continue;
else{
Union(e.from,e.to);
cost+=e.length;
}
}
cout<<cost<<endl;
}
}