#endif
int T ;
cin 》 T ;
while ( T -- ) {
cin 》 n 》 m ;
REP(i , 0, n - 1 ) {
REP(j , 0 , m - 1)scanf("%d",&Map[i][j]) ;
}
cin 》 tt ;
REP(i , 0 , tt - 1) {
RD(tk[i].x) ;
RD(tk[i].y) ;
}
REP(i , 0 , tt - 1) {
REP(j , 0 , tt - 1) {
MM[i][j] = inf ;
}
MM[i][i] = 0 ;
D[i] = inf ;
}
for (int i = 0 ; i < (1 《 tt) ; i ++ ) {
for (int j = 0 ; j < tt ; j ++ )dp[i][j] = inf ;
}
REP(i , 0 , tt - 1) {
init(i) ;
REP(j , 0 , tt - 1) {
if(i == j)continue ;
MM[i][j] = min(MM[i][j] , dis[tk[j].x][tk[j].y]) ;//宝藏到宝藏之间的最近距离
}
dp[1 《 i][i] = D[i] + Map[tk[i].x][tk[i].y] ;//该宝藏到达边的最近距离
}
for (int i = 0 ; i < 1 《 tt ; i ++ ) {
for (int j = 0 ; j < tt ; j ++ ) {
if(i & (1 《 j) == 0)continue ;
if(dp[i][j] == inf)continue ;
for (int k = 0 ; k < tt ; k ++ ) {
if(i & (1 《 k))continue ;
int tp = i | (1 《 k) ;
dp[tp][k] = min(dp[tp][k] , dp[i][j] + MM[j][k]) ;
}
}
}
int ans = inf ;
for (int i = 0 ; i < tt ; i ++ ) {
ans = min(ans , dp[(1 《 tt) - 1][i] + D[i] ) ;
}
cout 《 ans 《 endl;
}
return 0 ;
}
/*
5
4 4
3 3 3 3
3 -1 -1 -1
3 -1 3 3
3 -1 -1 -1
1
2 2
5 5
1 1 1 1 1
1 -1 -1 -1 -1
1 -1 -1 -1 -1
1 -1 -1 -1 -1
1 -1 -1 -1 -1
2
4 0
0 4
3 3
3 2 3
5 4 3
1 4 2
1
1 1
3 3
3 2 3
5 4 3
1 4 2
2
1 1
2 2
*/