import java.util.*;
public class Main {
private static Scanner in;
static String[] head = new String[1000];//记录一个成语的头
static String[] tail = new String[1000];//记录一个成语的尾
static int[] time = new int[1000];//记录一个成语找到下一个成语的时间
static int[][] g = new int[1000][1000];//记录第i个成语找到第j个成语的时间
static int[] min = new int [1000];
static int n;
public static void main(String[] args) {
in = new Scanner(System.in);
int len,i,k,h;
String str;
//对于每一组测试数据
while(in.hasNext()) {
n=in.nextInt();
if(n==0) break;
for( i=0;i<n;i++) {
time[i]=in.nextInt();
str=in.next();
len=str.length();
head[i]="" + str.charAt(0)+str.charAt(1)+str.charAt(2)+str.charAt(3);
tail[i]="" + str.charAt(len-4)+str.charAt(len-3)+str.charAt(len-2)+str.charAt(len-1);
}
//记录第i个成语找到第j个成语的时间
for(k=0;k<n;k++) {
for( h=0;h<n;h++) {
if((head[k].equals(tail[h]))){
g[h][k]=time[h];
}
else {
g[h][k] = 1000000000;
}
}
}
//调用Dijkstra最短路径算法
dist();
if(min[n-1]==1000000000){
System.out.println(-1);
}
else {
System.out.println(min[n-1]);
}
}
}
public static void dist(){
int[] v=new int[n];
int d,k,i,j,h;
for(i=0;i<n;i++) {
min[i]=1000000000;
v[i]=0;
}
min[0]=0;
//每一次循环,加入一个结点到v
for(j=0;j<n;j++) {
//找出从第一个成语到下一个成语的最短路径
for(d=-1,k=0;k<n;k++)
if(v[k]==0&&(d==-1||min[k]<min[d])) {
d=k;
}
//更新与d直接相邻顶点的dist值
for(v[d]=1,h=0;h<n;h++) {
if(v[h]==0&&((min[d]+g[d][h])<min[h])){
min[h]=min[d]+g[d][h];
}
}
}
}
}
/**************************************************************
Problem: 2134
User: admin
Language: Java
Result: Accepted
Time:1293 ms
Memory:53412 kb
****************************************************************/