/* 基本的最小生成树问题 将已经存在的边重新建图权值为0,再prim就可以 这个题用prim来做还是比较简单的
*/
#include<cstdio>
#include<cstring>#define INF 1000+10
int map[110][110],vis[110],low[110];
int prim(int n)
{
int ans=0;
for(int i = 0; i <= n; i++)
{
vis[i] = 0;
low[i] = map[1][i];
}
vis[1] = 1;
for(int i = 1; i <= n; i++)
{
int temp = INF,tp=-1;
for(int j = 1; j <= n; j++)
if(!vis[j]&&temp>low[j])
{
tp = j;
temp = low[j];
}
if(tp==-1) continue;
int k = tp;
vis[k] = 1;
ans += low[k];
for(int j = 1; j <= n; j++)
{
if(!vis[j]&&low[j]>map[k][j])
{
low[j] = map[k][j];
}
}
}
return ans;
}
int main()
{
int n,q,a,b;
while(scanf("%d",&n)==1)
{
memset(map,0,sizeof(map));
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
scanf("%d",&map[i][j]);
scanf("%d",&q);
while(q--)
{
scanf("%d%d",&a,&b);
map[a][b]=map[b][a]=0;
}
printf("%d\n",prim(n));
}
}