/*
分析:
简单最短路。
数学是死角,所以暂时不会什么好的方法,暴力水过的,
注意A、B、C三点互异。
2012-12-18
*/
#include"stdio.h"
#include"string.h"
#include"stdlib.h"
int n,m;
int map[90][90];
int E[90][90][90];
void get_floyd()
{
int k,i,l;
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(l=1;l<=n;l++)
if(map[i][k]+map[k][l]<map[i][l])
map[i][l]=map[i][k]+map[k][l];
}
void get_map()
{
int i,l,j;
int i2,l2,z;
int t[90][90];
for(j=1;j<=n;j++)
for(i=1;i<=m;i++)
for(l=1;l<=m;l++)
scanf("%d",&E[j][i][l]);
for(i=1;i<=n;i++)
for(l=1;l<=n;l++)
{
if(i==l) map[i][l]=0;
else map[i][l]=11111111;
}
for(i=1;i<=n;i++)
{
for(l=1;l<=n;l++)
{
if(i==l) continue;
for(i2=1;i2<=m;i2++)
for(l2=1;l2<=m;l2++)
{
t[i2][l2]=0;
for(z=1;z<=m;z++) t[i2][l2]+=E[i][i2][z]*E[l][z][l2];
}
for(j=1;j<=n;j++)
{
if(j==i || j==l) continue;
if(map[i][j]==1) continue;
int flag=1;
for(i2=1;i2<=m;i2++)
{
for(l2=1;l2<=m;l2++)
{
if(t[i2][l2]!=E[j][i2][l2]) {flag=0;break;}
}
if(!flag) break;
}
if(flag) map[i][j]=1;
}
}
}
get_floyd();
}
int main()
{
int k,a,b;
while(scanf("%d%d",&n,&m),n||m)
{
get_map();
scanf("%d",&k);
while(k--)
{
scanf("%d%d",&a,&b);
if(map[a][b]!=11111111) printf("%d\n",map[a][b]);
else printf("Sorry\n");
}
}
return 0;
}