#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,l1,a,fa[200],am[200];
struct edge{
int x,y,v;
}e[20000];
void init()
{
for(int i=0;i<n;i++)
{
fa[i] = i;
am[i] = 1;
}
}
bool cmp(edge x,edge y)
{
return x.v<y.v;
}
int findFarther(int x)
{
while(fa[x]!=x){
x = fa[x];
}
return x;
}
bool Union(int x,int y)
{
int rootx = findFarther(x),rooty = findFarther(y);
if(rootx!=rooty){
if(am[rootx]>am[rooty]){
fa[rooty] = rootx;
am[rootx]+=am[rooty];
}
else{
fa[rootx] = rooty;
am[rooty]+=am[rootx];
}
return true;
}
else return false;
}
int kruskal()
{
int sum = 0,sum2 = 0;
for(int i=0;i<l1;i++)
{
if(Union(e[i].x,e[i].y)){
sum2++;
sum+=e[i].v;
}
}
if(sum2==n-1)return sum;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
init();
l1 = 0;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
scanf("%d",&a);
e[l1].x = i;
e[l1].y = j;
e[l1].v = a;
l1++;
}
sort(e,e+l1,cmp);
printf("%d\n",kruskal());
}
return 0;
}