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
****************************************************************/