#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 100
struct node {
int x,y,dis;
}road[N*N];
int pre[N];
int find(int n) {
return pre[n]=n==pre[n]?n:find(pre[n]);
}
int cmp(const void *a,const void *b) {
return (*(struct node *)a).dis>(*(struct node *)b).dis?1:-1;
}
int main() {
int n,q,a,b,f1,f2,i,j,sum,cnt;
while(scanf("%d",&n)!=EOF) {
for(i=1;i<=n;i++)
pre[i]=i;
for(i=0;i<n;i++)
for(j=0;j<n;j++) {
scanf("%d",&road[i*n+j].dis);
road[i*n+j].x=i+1;road[i*n+j].y=j+1;
}
qsort(road,n*n,sizeof(road[0]),cmp);
scanf("%d",&q);
cnt=0;//因为只需n-1条边就一定会连通优化
while(q--) {
scanf("%d%d",&a,&b);
f1=find(a);
f2=find(b);
if(f1!=f2) {
cnt++;
pre[f2]=f1;
}
}
sum=0;
for(i=0;cnt<n-1&&i<n*n;i++) {
f1=find(road[i].x);
f2=find(road[i].y);
if(f1!=f2) {
pre[f2]=f1;
cnt++;
sum+=road[i].dis;
}
}
printf("%d
",sum);
}
return 0;
}