path[i][j] = j; // path[i][j]表示点i到j经过的第一个点`
}
}
}
void Floyd(){
for(int k=1; k<=n; ++k)
for(int i=1; i<=n; ++i)
for(int j=1; j<=n; ++j)if(w[i][k]!=INF && w[k][j]!=INF){
int tmp = w[i][k]+w[k][j]+charge[k];
if(w[i][j] > tmp){
w[i][j] = tmp;
path[i][j] = path[i][k];
}
else if(w[i][j] == tmp && path[i][j]>path[i][k]){
path[i][j] = path[i][k];
}
}
}
int main(){
int i,j,src,des;
while(scanf("%d",&n),n){
init();
for(i=1; i<=n; ++i){
scanf("%d",&w[i][j]);
if(w[i][j]==-1) w[i][j]=INF;
}
}
for(i=1; i<=n; ++i)
scanf("%d",&charge[i]);
Floyd();
while(scanf("%d%d",&src,&des)){
if(src==-1&&des==-1) break;
printf("From %d to %d :\n",src,des);
printf("Path: ");
int u = src;
printf("%d",u);
while(u != des){
printf("-->%d",path[u][des]);
u = path[u][des];
}
puts("");
printf("Total cost : %d\n\n", w[src][des]);
}
}
return 0;
}