
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define max 10000
typedef struct MGraph
{
int matrix[max][max];
int vernum;
}MGraph;
int **P;
int **D;
int** MemoryMalloc(int S,int **M){
M = (int**)malloc(S*sizeof(int*));
for(int i = 0;i < S;i++)
{
M[i] = (int*)malloc(S*sizeof(int));
}
return M;
}
void MemoryFree(int S,int **M){
for(int i = 0;i < S;i++)
{
free(M[i]);
}
free(M);
}
void InitMGraph(MGraph *G){
scanf("%d",&G->vernum);
int i,j;
for(i = 0;i < G->vernum;i++)
{
for(j = 0;j < G->vernum;j++)
{
scanf("%d",&G->matrix[i][j]);
}
}
}
void Floyd(MGraph *G){
int i,j,k,s[max];
for(i = 0;i < G->vernum;i++)
{
for(j = 0;j < G->vernum;j++)
{
D[i][j] = G->matrix[i][j];
if(D[i][j] != 10000)
{
P[i][j] = i;
}
}
}
for(i = 0;i < G->vernum;i++)
{
s[i] = 0;
}
for(i = 0;i < G->vernum;i++)
{
s[i] = 1;
for(j = 0;j < G->vernum;j++)
{
for(k = 0;k < G->vernum;k++)
{
if(D[j][k] > D[j][i] + D[i][k])
{
D[j][k] = D[j][i] + D[i][k];
P[j][k] = i;
}
}
}
}
}
int main(){
MGraph *g;
g = (MGraph*)malloc(sizeof(MGraph));
P=NULL;
D=NULL;
InitMGraph(g);
P = MemoryMalloc(g->vernum,P);
D = MemoryMalloc(g->vernum,D);
Floyd(g);
int *a,vi,vj,n = 0;
scanf("%d",&n);
a = (int*)malloc(sizeof(int));
for(int i = 0;i < n;i++)
{
scanf("%d %d",&vi,&vj);
a[i] = D[vi][vj];
}
for(int i = 0;i < n;i++)
{
printf("%d\n",a[i]);
}
MemoryFree(g->vernum,P);
MemoryFree(g->vernum,D);
return 0;
}