http://jmunetds.openjudge.cn/ex6/T001/
#include <iostream>
#include <cstdio>
#include <map>
#include <string>
#define MAX 35
//#include<cctype>
using namespace std;
const int INF=0x3f3f3f3f;
map<string,int> name;
map<int,string> num;
int p,q,r;
int a[MAX][MAX];
int nex[MAX][MAX];
void flyod(){
for(int k=1;k<=p;k++)
for(int i=1;i<=p;i++)
for(int j=1;j<=p;j++){
if(a[i][j]>a[i][k]+a[k][j]){
a[i][j]=a[i][k]+a[k][j];
nex[i][j]=nex[i][k];
}
}
}
void print(int st,int ed){
cout<<num[st];
if(st==ed){
cout<<endl;
return;
}
printf("->(%d)->",a[st][nex[st][ed]]);
print(nex[st][ed],ed);
}
int main()
{
scanf("%d",&p);
for(int i=1;i<=p;i++){
string str;
cin>>str;
name[str]=i;
num[i]=str;
}
for(int i=1;i<=p;i++)
for(int j=1;j<=p;j++){
if(i==j) a[i][j]=0;
else a[i][j]=INF;
nex[i][j]=j;
}
scanf("%d",&q);
for(int i=1;i<=q;i++){
string str1,str2;
int w;
cin>>str1>>str2;
scanf("%d",&w);
a[name[str1]][name[str2]]=w;
a[name[str2]][name[str1]]=w;
}
flyod();
scanf("%d",&r);
for(int i=1;i<=r;i++){
string str1,str2;
cin>>str1>>str2;
print(name[str1],name[str2]);
}
return 0;
}