#include<iostream> #include<cstring> #include<algorithm> using namespace std; const int N=110; int p[N]; struct edge{ int a; int b; int w; }e[N*N]; int map[N][N],flag[N][N],num,n; bool cmp(edge a,edge b) { return a.w<b.w; } int find(int x) { if(p[x]!=x) p[x]=find(p[x]); return p[x]; } int main() { while(cin>>n&&n) { memset(flag,0,sizeof flag); memset(map,0,sizeof map); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) cin>>map[i][j]; int m,x,y; cin>>m; while(m--) { cin>>x>>y; flag[x][y]=1; } num=0; for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) if(flag[i][j]) { e[num].a=i; e[num].b=j; e[num++].w=0; } else { e[num].a=i; e[num].b=j; e[num++].w=map[i][j]; } sort(e,e+num,cmp); for(int i=1;i<=n;i++) p[i]=i; int sum=0; for(int i=0;i<num;i++) { int a=find(e[i].a); int b=find(e[i].b); int w=e[i].w; if(a!=b) { p[a]=b; sum+=w; } } cout<<sum<<endl; } return 0; }