#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <string>
#include <map>
#include <queue>
using namespace std;
#ifndef ONLINE_JUDGE
#include <fstream>
ifstream fin("test.txt");
#define cin fin
#endif
const int INF = 1000000;
int graph[200][200];
map <string, int> m;
int d[200],vis[200];
int main()
{
ios::sync_with_stdio(false);
int i,t,num,j;
string a,b;
int n;
while(cin >> n)
{
if(n == -1)
break;
m.clear();
memset(graph,INF,sizeof(graph));
cin >> a >> b;
int ok = 1;
if(a == b)
{
ok = 0;
}
m[a] = 1;
m[b] = 2;
num = 3;
for(i = 0; i < n; ++i)
{
cin >> a >> b >> t;
if(!m[a])
m[a] = num++;
if(!m[b])
m[b] = num++;
if(t < graph[m[a]][m[b]])
graph[m[a]][m[b]] = graph[m[b]][m[a]] = t;
}
memset(vis,0,sizeof(vis));
for(i = 1; i <= num; ++i)
d[i] = (i == 1) ? 0 : INF;
for(i = 1; i <= num; ++i)
{
int MIN = INF,x = 1;
for(int y = 1; y <= num; ++y)
if(!vis[y] && d[y] < MIN)
MIN = d[x=y];
vis[x] = 1;
for(int y = 1; y <= num; ++y)
d[y] = min(d[y],d[x]+graph[x][y]);
}
if(ok == 0)
{
cout << 0 << endl;
continue;
}
if(d[2]!=INF)
cout << d[2] << endl;
else
cout << -1 << endl;
}
return 0;
}