#include<stdio.h>
#include<algorithm>
using namespace std;
#define S 110
struct edge
{
int u , v , w ;
}e[S * S];
int n , m ,p[S];//这一这三个变量的位置要小心,不然,嘿嘿
void init ()
{
for(int i = 1 ; i <= S ; i++)
p[i] = i ;
}
bool cmp (edge a , edge b)
{
return a.w < b.w ;
}
int find (int x)
{
return x == p[x] ? x : p[x] = find(p[x]) ;
}
void kruskal ()
{
sort (e + 1 , e + m , cmp) ;
int ans = 0 , x , y ;
for (int i = 1 ; i < m ; i++) {
x = find (e[i].u) ;
y = find (e[i].v) ;
if (x != y) {
ans += e[i].w ;
p[x] = y ;
}
}
printf ("%d\n" , ans) ;
}
int main ()
{
// freopen ("a.txt" , "r" ,stdin) ;
int k , built ;
int x , y ;
while (~ scanf ("%d" , &n ) ) {
init () ;
m = 1 ;
for (int i = 1 ; i <= n ; i++) {
for (int j = 1 ; j <= n ; j++) {
if (j <= i) {
scanf ("%d" , &k ) ;
continue ;
}
scanf ("%d" , &e[m].w) ;
e[m].u = i ;
e[m].v = j ;
m++ ;
}
}
scanf ("%d" , &built );
for (int i = 0 ; i < built ; i++) {
scanf ("%d%d" , &x , &y ) ;
x = find (x) ;
y = find (y) ;
p[x] = y ;
}
kruskal () ;
}
return 0 ;
}