#include<iostream>
#include<map>
#include<cstring>
using namespace std;
int N,K,weight[210],e[210][210],w[210],d[210],pre[210],pt[210],num[210];
const int inf=1000000000;
string st;
bool vis[210];
map<int,string> intToString;
map<string,int> stringToInt;
void dijkstra(int start){
memset(vis,false,sizeof(vis));
// memset(w,0,sizeof(w));
// memset(num,0,sizeof(num));
// memset(pt,0,sizeof(pt));
fill(d,d+210,inf);
for(int i=0;i<N;i++)
pre[i]=i;
d[start]=0;
w[start]=0;
num[start]=1;
for(int i=0;i<N;i++){
int u=-1,minn=inf;
for(int j=0;j<N;j++){
if(vis[j]==false&&d[j]<minn){
u=j;
minn=d[j];
}
}
if(u==-1) break;
vis[u]=true;
for(int v=0;v<N;v++){
if(vis[v]==false&&e[u][v]!=inf){
if(d[v]>d[u]+e[u][v]){
d[v]=d[u]+e[u][v];
w[v]=weight[v]+w[u];
pre[v]=u;
pt[v]=pt[u]+1;
num[v]=num[u];
}else if(d[v]==d[u]+e[u][v]){
num[v]+=num[u];
if(w[v]<weight[v]+w[u]){
w[v]=weight[v]+w[u];
pre[v]=u;
pt[v]=pt[u]+1;
}else if(w[v]==weight[v]+w[u]){
double uavg=(double)1.0*(weight[v]+w[u])/(pt[u]+1);
double vavg=(double)1.0*w[v]/pt[v];
if(uavg>vavg){
pre[v]=u;
pt[v]=pt[u]+1;
}
}
}
}
}
}
}
void dfs(int v){
if(v==0){
cout<<intToString[0];
return;
}
dfs(pre[v]);
cout<<"->"<<intToString[v];
}
int main(){
string name,name1,name2;
cin>>N>>K>>st;
stringToInt[st]=0;
intToString[0]=st;
fill(e[0],e[0]+210*210,inf);
for(int i=1;i<N;i++){
cin>>name;
stringToInt[name]=i;
intToString[i]=name;
cin>>weight[i];
}
for(int i=0;i<K;i++){
cin>>name1>>name2;
int id1=stringToInt[name1];
int id2=stringToInt[name2];
cin>>e[id1][id2];
e[id2][id1]=e[id1][id2];
}
dijkstra(0);
int rom=stringToInt["ROM"];
printf("%d %d %d %d\n",num[rom],d[rom],w[rom],w[rom]/pt[rom]);
dfs(rom);
}