#include<iostream> #include<cstdio> #include<queue> #define th(a) this->a=a using namespace std; const int maxn=150+10; const int inf=0x3f3f3f3f; struct trie_t{ int lnk[64],val; void init() { memset(lnk,0,sizeof(lnk)); val=0; } }; const char base='A'; struct Trie{ trie_t buf[maxn*maxn]; int len; void init() { buf[len=0].init(); } int insert(char *str,int val) { int now=0; for(int i=0;str[i];i++){ int &nxt=buf[now].lnk[str[i]-base]; if(!nxt) buf[nxt=++len].init(); now=nxt; } buf[now].val=val; return now; } int search(char *str) { int now=0; for(int i=0;str[i];i++) { int &nxt=buf[now].lnk[str[i]-base]; if(!nxt) return 0; now=nxt; } return buf[now].val; } }trie; struct Dijk{ int E[maxn][maxn],n; int d[maxn],p[maxn]; void init(int n) { th(n); memset(E,63,sizeof(E)); } void addedge(int a,int b,int val) { E[a][b]=E[b][a]=min(E[a][b],val); } void solve(int s){ static bool vis[maxn]; memset(vis,0,sizeof(vis)); memset(d,63,sizeof(d)); memset(p,255,sizeof(p)); d[s]=0; while(1) { int u=-1; for(int i=0;i<n;i++) { if(!vis[i]&&(u==-1||d[i]<d[u])){ u=i; } } if(u==-1||d[u]==inf) break; vis[u]=true; for(int v=0;v<n;v++) { if(d[u]+E[u][v]<d[v]){ d[v]=d[u]+E[u][v]; p[v]=u; } } } } }dijk; char start[40],end[40],s1[40],s2[40]; int a,b,t; int main() { int n,cnt; while(scanf("%d",&n)!=EOF) { if(n==-1)break; cnt=1;trie.init();dijk.init(maxn); scanf("%s %s",start,end); trie.insert(start,cnt++); trie.insert(end,cnt++); for(int i=0;i<n;i++) { scanf("%s %s %d",s1,s2,&t); a=trie.search(s1),b=trie.search(s2); if(a==0) a=cnt,trie.insert(s1,cnt++); if(b==0) b=cnt,trie.insert(s2,cnt++); dijk.addedge(a, b, t); dijk.addedge(b, a, t); } a=trie.search(start),b=trie.search(end); dijk.solve(a); printf("%d\n",dijk.d[b]==0x3f3f3f3f?-1:dijk.d[b]); } return 0; }