#include<iostream>
#include<cstdio>
#include<string.h>
#include<string>
#include<stack>
#include<set>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
#define ll __int64
#define lll unsigned long long
#define MAX 1000009
#define eps 1e-8
#define INF 0xfffffff
#define mod 1000000007
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
#define MAXN 1009
/*
题意:成语接龙
想法:单源最短路
*/
using namespace std;
int n;
int Edge[MAXN][MAXN];
int s[MAXN];//判断点是否加入
int dist[MAXN];//每个点与源点的最短距离
int path[MAXN];//路径
struct node
{
char f[5];
char e[5];
int w;
} p[MAX];
void Dijstra(int v0)
{
int i,j,k;
for(i = 0; i<n; i++)
{
dist[i] = Edge[v0][i];
s[i] = 0;
}
s[v0] = 1;
dist[v0] = 0;
for(i = 0; i<n; i++)
{
int min = INF;
int u = 0;
for(j = 0; j<n; j++)
{
if(!s[j]&&dist[j]<min)
{
u = j;
min = dist[j];
}
}
s[u] = 1;
for(k = 0; k<n; k++)
{
if(!s[k]&&(dist[u]+Edge[u][k]<dist[k])&&Edge[u][k]<INF)
{
dist[k] = dist[u]+Edge[u][k];
}
}
}
}
int main()
{
char str[109];
int m;
while(~scanf("%d",&n)&&n)
{
for(int i = 0; i<n; i++)
{
scanf("%d%s",&p[i].w,str);
for(int j = 0; j<4; j++)
{
p[i].f[j] = str[j];
}
p[i].f[4] = '\0';
int k = 0;
for(int j = strlen(str) - 4; j<=strlen(str) - 1; j++)
{
p[i].e[k++] = str[j];
}
p[i].e[k] = '\0';
//cout<<p[i].f<<"xxxxxxxx"<<p[i].e<<endl;
}
for(int i = 0; i<n; i++)
{
for(int j = 0; j<n; j++)
{
Edge[i][j] = INF;
if(i==j)continue;
if(strcmp(p[i].e,p[j].f)==0)
{
Edge[i][j] = p[i].w;
}
}
}
Dijstra(0);
if(dist[n-1]==INF) puts("-1");
else
printf("%d\n",dist[n-1]);
}
return 0;
}
#include<cstdio>
#include<string.h>
#include<string>
#include<stack>
#include<set>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
#define ll __int64
#define lll unsigned long long
#define MAX 1000009
#define eps 1e-8
#define INF 0xfffffff
#define mod 1000000007
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
#define MAXN 1009
/*
题意:成语接龙
想法:单源最短路
*/
using namespace std;
int n;
int Edge[MAXN][MAXN];
int s[MAXN];//判断点是否加入
int dist[MAXN];//每个点与源点的最短距离
int path[MAXN];//路径
struct node
{
char f[5];
char e[5];
int w;
} p[MAX];
void Dijstra(int v0)
{
int i,j,k;
for(i = 0; i<n; i++)
{
dist[i] = Edge[v0][i];
s[i] = 0;
}
s[v0] = 1;
dist[v0] = 0;
for(i = 0; i<n; i++)
{
int min = INF;
int u = 0;
for(j = 0; j<n; j++)
{
if(!s[j]&&dist[j]<min)
{
u = j;
min = dist[j];
}
}
s[u] = 1;
for(k = 0; k<n; k++)
{
if(!s[k]&&(dist[u]+Edge[u][k]<dist[k])&&Edge[u][k]<INF)
{
dist[k] = dist[u]+Edge[u][k];
}
}
}
}
int main()
{
char str[109];
int m;
while(~scanf("%d",&n)&&n)
{
for(int i = 0; i<n; i++)
{
scanf("%d%s",&p[i].w,str);
for(int j = 0; j<4; j++)
{
p[i].f[j] = str[j];
}
p[i].f[4] = '\0';
int k = 0;
for(int j = strlen(str) - 4; j<=strlen(str) - 1; j++)
{
p[i].e[k++] = str[j];
}
p[i].e[k] = '\0';
//cout<<p[i].f<<"xxxxxxxx"<<p[i].e<<endl;
}
for(int i = 0; i<n; i++)
{
for(int j = 0; j<n; j++)
{
Edge[i][j] = INF;
if(i==j)continue;
if(strcmp(p[i].e,p[j].f)==0)
{
Edge[i][j] = p[i].w;
}
}
}
Dijstra(0);
if(dist[n-1]==INF) puts("-1");
else
printf("%d\n",dist[n-1]);
}
return 0;
}