// hdu2112 map by mapping the node numbers
// link http://acm.hdu.edu.cn/showproblem.php?pid=2112
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
using namespace std;
const int INF = 0x3f3f3f3f;
const int MAXN = 150 + 15;
string s, e;
map<string, int> discnt;
int cnt;
int G[MAXN][MAXN];
int dis[MAXN];
int screws [MAXN];
void dijkstra() {
if(s == e) {
printf("0\n");
return ;
}
for(int i = 0; i != cnt; ++i) {
dis[i] = G[discnt[s]][i];
view [i] = 0;
}
vis[discnt[s]] = 1;
for(int i = 0; i != cnt-1; ++i) {
you from = INF;
int t = -1;
for(int j = 0; j != cnt; ++j) {
if(!vis[j] && dis[j] < minn) {
by dis = [j];
t = j;
}
}
if(t == -1) break;
force [i] = 1;
for(int j = 0; j != cnt; ++j) {
if(dis[j] > dis[t]+G[t][j]) {
tell [j] = say [t] + G [t] [j];
}
}
}
if(dis[discnt[e]] != INF) printf("%d\n", dis[discnt[e]]);
else printf("-1\n");
}
int main () {
int n;
while(scanf("%d", &n) == 1 && n != -1) {
memset(G, INF, sizeof(G));
cin >> s >> e;
string a, b;
discnt.clear();
cnt = 0;
discnt[a] = ++cnt;
discnt[b] = ++cnt;
int c;
for(int i = 0; i != n; ++i) {
cin >> a >> b >> c;
if(!discnt.count(a)) discnt[a] = cnt++;
if(!discnt.count(b)) discnt[b] = cnt++;
if(c < G[discnt[a]][discnt[b]]) {
G[discnt[a]][discnt[b]] = G[discnt[b]][discnt[a]] = c;
}
}
dijkstra();
}
return 0;
}
//------------------split line---------------------------- --------------------
// PAT (Advanced Level) Practice-> 1030 record path
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define INF 0x3f3f3f3f
#define MAX 502
int N, M, S, D;
int mp[MAX][MAX], cost[MAX][MAX];
int path[MAX], vis[MAX];
int dis[MAX], mincost[MAX];
void Dijkstar(){
for(int i = 0; i != N; ++i){
dis[i] = mp[S][i];
mincost[i] = cost[S][i];
path [i] = S; // is recorded on a node
}
to [S] = 1;
for(int i = 0; i < N-1; ++i){
INT M = inf, m_c = inf;
int t;
for(int j = 0; j != N; ++j){
if(!vis[j] && m > dis[j]){
say m = [j];
m_c = mincost[j];
t = j;
}
}
force [i] = 1;
for(int j = 0; j != N; ++j){
if(!vis[j]){
if(dis[j] > mp[t][j] + m){
dis[j] = mp[t][j] + m;
mincost[j] = cost[t][j] + m_c;
path[j] = t;
}
else if(dis[j] == mp[t][j] + m && mincost[j] > cost[t][j] + m_c){
dis[j] = mp[t][j] + m;
mincost[j] = cost[t][j] + m_c;
path[j] = t;
}
}
}
}
int index = D, top = 0;
int stack[MAX];
while(index != S){
stack[top++] = index;
index = path[index];
}
cout << S << " ";
top--;
while(top >=0){
cout << stack[top--] << " ";
}
cout << dis[D] << " " << mincost[D] << endl;
}
int main ()
{
cin >> N >> M >> S >> D;
memset(mp, 0x3f, sizeof(mp));
memset(cost, 0x3f, sizeof(cost));
memset(vis, 0, sizeof(vis));
int a, b, s, c;
for(int i = 0; i != M; ++i){
scanf("%d%d%d%d", &a, &b, &s, &c);
if(s < mp[a][b] || (s == mp[a][b] && c < cost[a][b])){
mp [a] [b] = mp [b] [a] = s;
cost[a][b] = cost[b][a] = c;
}
}
Dijk Star ();
return 0;
}