#include<stdio.h>
int map[1005][1005];
int path[1005][1005];
int charge[1005];
int n;
int main()
{
int i,j,k,start,end;
while(scanf("%d",&n)&&n!=0)
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
path[i][j]=j;
scanf("%d",&map[i][j]);
if(map[i][j]==-1)
map[i][j]=100000000;
}
for(i=1;i<=n;i++)
scanf("%d",&charge[i]);
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if(map[i][j]>map[i][k]+map[k][j]+charge[k])
{
map[i][j]=map[i][k]+map[k][j]+charge[k];
path[i][j]=path[i][k];
}
else if(map[i][j]==map[i][k]+map[k][j]+charge[k])
{
if(path[i][j]>path[i][k])
path[i][j]=path[i][k];
}
}
while(scanf("%d%d",&start,&end)&&start!=-1&&end!=-1)
{
printf("From %d to %d :\nPath: ",start,end);
int s=start;
printf("%d",start);
while(s!=end)
{
printf("-->%d",path[s][end]);
if(s==path[s][end])
break;
s=path[s][end];
}
printf("\nTotal cost : %d\n\n",map[start][end]);
}
}
return 0;
}
/*
5
0 3 22 -1 4
3 0 5 -1 -1
22 5 0 9 20
-1 -1 9 0 4
4 -1 20 4 0
5 17 8 3 1
1 3
3 5
2 4
-1 -1
0
*/
int map[1005][1005];
int path[1005][1005];
int charge[1005];
int n;
int main()
{
int i,j,k,start,end;
while(scanf("%d",&n)&&n!=0)
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
path[i][j]=j;
scanf("%d",&map[i][j]);
if(map[i][j]==-1)
map[i][j]=100000000;
}
for(i=1;i<=n;i++)
scanf("%d",&charge[i]);
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if(map[i][j]>map[i][k]+map[k][j]+charge[k])
{
map[i][j]=map[i][k]+map[k][j]+charge[k];
path[i][j]=path[i][k];
}
else if(map[i][j]==map[i][k]+map[k][j]+charge[k])
{
if(path[i][j]>path[i][k])
path[i][j]=path[i][k];
}
}
while(scanf("%d%d",&start,&end)&&start!=-1&&end!=-1)
{
printf("From %d to %d :\nPath: ",start,end);
int s=start;
printf("%d",start);
while(s!=end)
{
printf("-->%d",path[s][end]);
if(s==path[s][end])
break;
s=path[s][end];
}
printf("\nTotal cost : %d\n\n",map[start][end]);
}
}
return 0;
}
/*
5
0 3 22 -1 4
3 0 5 -1 -1
22 5 0 9 20
-1 -1 9 0 4
4 -1 20 4 0
5 17 8 3 1
1 3
3 5
2 4
-1 -1
0
*/