#include<iostream>
using namespace std;
#define inf 0xffffff
const int MAXN = 105;
int maze[MAXN][MAXN], vis[MAXN], mincost[MAXN];
int n, q;
int prim(int v)
{
for(int i = 1; i <= n; i++)
mincost[i] = maze[v][i];
vis[v] = 1;
int sum =0, k;
for(int i = 2; i <= n; i++)
{
int mina = inf;
for(int j = 1; j <= n; j++)
{
if(mincost[j] <= mina && !vis[j])
{
mina = mincost[j]; k = j;
}
}
sum += mina;vis[k] = 1;
for(int j = 1; j <= n; j++)
{
if(mincost[j] >= maze[k][j] && !vis[j]) {
mincost[j] = maze[k][j];
}
}
}
return sum;
}
int main()
{
cin >> n;
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
cin >> maze[i][j];
}
cin >> q;
for(int i = 1; i <= q; i++)
{
int a, b;
cin >> a >> b;
maze[a][b] = maze[b][a] =0 ;
}
cout << prim(1) << endl;
return 0;
}
//kruskal方法再写一遍
#include <iostream>
#include<algorithm>
using namespace std;
const int N = 105;
int father[N], rank[N];
struct edge
{
int u, v, value;
}ee[N * N];
int graph[N][N], flag[N][N], numedge, n;
bool cmp(edge a, edge b)//按照edge.value的顺序从小到大排序
{
return a.value < b.value;
}
void init(int n)
{
for(int i = 1; i <= n; i++)
{
father[i] = i;
rank[i] = 0;
}
}
int find(int x)
{
if(x != father[x])
father[x] = find(father[x]);
return father[x];
}
bool same(int x, int y)
{
return find(x) == find(y);
}
void unite(int x, int y)
{
x = find(x);
y = find(y);
if(x == y) return ;
if(rank[x] < rank[y])
father[x] = y;
else
{
father[y] = x;
if(rank[x] == rank[y])
rank[x]++;
}
}
int kruskal()
{
sort(ee, ee + numedge, cmp);
init(n);
int sum = 0;
for(int i = 0; i < numedge; i++)
{
edge e = ee[i];
if(!same(e.u, e.v))
{
unite(e.u, e.v);
sum += e.value;
}
}
return sum;
}
int main()
{
//freopen("input.txt", "r", stdin);
cin >> n;
for(int i = 1; i <= n; i++)
for(int j = 1;j <= n; j++)
cin >> graph[i][j];
int q, a, b;
cin >> q;
for(int i = 1; i <= q; i++)
{
cin >> a >> b;
flag[a][b] = 1;
}
numedge = 0;
for(int i = 1; i < n; i++)
{
for(int j =1; j <= n; j++)
{
if(flag[i][j])
{
ee[numedge].u = i;
ee[numedge].v = j;
ee[numedge].value = 0;
numedge++;
}
else
{
ee[numedge].u = i;
ee[numedge].v = j;
ee[numedge].value = graph[i][j];
numedge++;
}
}
}
int ans = kruskal();
cout << ans << endl;
return 0;
}