#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; }