#include <stdio.h>
#include <iostream>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <stdlib.h>
#include <queue>
#include <vector>
#include <map>
#include <stack>
using namespace std;
const int inf = 0x3f3f3f3f;
const int Max = 11000;
typedef long long int LL;
int ma[210][210], num[210], a[210], b[210];//ma存图,num记录城市军队数量,a临时数组路径,b更新的路径
int vis[210], mindep, maxsum, n, E, j;//mindep最短路的长度,maxsum最大杀敌数
int sumdep, sumcunt;//最短路径的条数,最大解放城市数
void Dfs(int k, int dep, int cunt,int sum, int j)//k下一个城市,dep走了多少路,cunt解放了多少城市,sum杀了多少敌军,j同cunt
{
int i;
if(k == E)
{
if(dep < mindep)
{
mindep = dep;
sumcunt = cunt;
maxsum = sum;
sumdep = 1;
for(i = 0; i < j; i++)
{
b[i] = a[i];
}
}
else if(dep == mindep)
{
sumdep++;
if(sumcunt < cunt)
{
sumcunt = cunt;
maxsum = sum;
for(i = 0; i < j; i++)
{
b[i] = a[i];
}
}
else if(sumcunt == cunt)
{
if(sum > maxsum)
{
maxsum = sum;
for(i = 0; i < j; i++)
{
b[i] = a[i];
}
}
}
}
}
for(i = 1; i < n; i++)
{
if(!vis[i] && ma[k][i])
{
vis[i] = 1;
a[j++] = i;
Dfs(i, dep+ma[k][i], cunt+1, sum+num[i], j);
j--;
vis[i] = 0;
}
}
}
int main()
{
int i, k;
int x, m;
char st[5], en[5];
char s[5], s1[5], s2[5];
map<string, int>str;//将数存字符里
map<int, string>str1;//将字符存数里
cin>>n>>m>>st>>en;
memset(ma, 0, sizeof(ma));
memset(vis, 0, sizeof vis);
str[st] = 0;
str1[0] = st;
for(i = 1; i < n; i++)
{
cin>>s>>x;
if(strcmp(en, s) == 0)
E = i;
str[s] = i;
str1[i] = s;
num[i] = x;
}
for(i = 1; i <= m; i++)
{
cin>>s1>>s2>>x;
ma[str[s1]][str[s2]] = x;
ma[str[s2]][str[s1]] = x;
}
vis[0] = 1;
mindep = inf;
maxsum = 0;
sumcunt = 0;
sumdep = 0;
a[0] = 0;
Dfs(0, 0, 0, 0, 1);
for(i = 0; i < sumcunt; i++)
{
cout<<str1[b[i]]<<"->";
}
printf("%s\n", en);
cout<<sumdep<<" "<<mindep<<" "<<maxsum<<endl;
}