#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;
}