#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
//英语 最小生成树 并查集
int da[104][104];
struct nod{
int x;
int y;
int len;
};
bool cmp(nod a,nod b)
{
return a.len<b.len;
}
vector<nod> ve;
int fa[108];
int find(int x)
{
if(x==fa[x])
{
return x;
}else
{
return fa[x]=find(fa[x]);
}
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
fa[i]=i;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin>>da[i][j];
if(i>j)
{
nod t;
t.len=da[i][j];
t.x=i;
t.y=j;
ve.push_back(t);
}
}
}
sort(ve.begin(),ve.end(),cmp);
int m;
cin>>m;
for(int i=0;i<m;i++)
{
int a,b;
cin>>a>>b;
int ta=find(a);
int tb=find(b);
fa[ta]=tb;
}
int sum=0;
for(int i=0;i<ve.size();i++)
{
int tx=ve[i].x;
int ty=ve[i].y;
tx=find(tx);
ty=find(ty);
if(tx!=ty)
{
fa[tx]=ty;
sum=sum+ve[i].len;
}
}
cout<<sum<<endl;
return 0;
}