/*這個題目沒什麼好說的但因為RE了將近2個小時不紀念對不起自己記住,秒殺才是王道拖得越久越不利*/#include<stdio.h>#include<string.h>#define max_n 160#define inf 1234567int vis[max_n];long dist[max_n];int map[max_n][max_n];char name[max_n][40];int n,m;void dij(int v){ int i,j,max,f; memset(vis,0,sizeof(vis)); for(i=1;i<=m;i++) dist[i]=map[v][i]; dist[v]=0; vis[v]=1; for(i=1;i<=m;i++) { max=inf,f=0; for(j=1;j<=m;j++) if(!vis[j] &&max>dist[j]) { max=dist[j]; f=j; } if(f==0) break; vis[f]=1; for(j=1;j<=m;j++) if(!vis[j]&&dist[j]>dist[f]+map[f][j]) dist[j]=dist[f]+map[f][j]; }}int find(char str[32]){ int i; for(i=1;i<=m;i++) if(strcmp(name[i],str)==0) return i; if(m==0||i>m) { m++; strcpy(name[m],str); return m; }}//此函數是個小技巧,參考了別人的代碼。int main(){ int s,e,a,b,c,i,j; char start[40],end[40],s1[40],s2[40]; while(scanf("%d",&n)!=EOF) { if(n==-1) break; m=0; scanf("%s%s",start,end); for(i=0;i<max_n;i++) for(j=0;j<max_n;j++) map[i][j]=inf; for(i=0;i<n;i++) { scanf("%s%s%d",s1,s2,&c); a=find(s1); b=find(s2); if(map[a][b]>c) map[a][b]=map[b][a]=c; } s=find(start); e=find(end); if(s==e) printf("0\n"); else { dij(s); if(dist[e]==inf) printf("-1\n"); else printf("%ld\n",dist[e]); } } return 0;}