/*
Made by Karen
20:30 at Mar.5,2012
Kruskal
*/
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
#define max_ve 120
#define max_ed 14400
struct node
{
int par,ans;
}Vertex[max_ve];
struct Edge
{
int u,v,weight;
}edge[max_ed];
int cmp(const void *a,const void *b)
{
return (*(Edge*)a).weight-(*(Edge*)b).weight;
}
int find(int j)
{
if(Vertex[j].par!=j)
Vertex[j].par=find(Vertex[j].par);
return Vertex[j].par;
}
bool union_set(int s,int t)
{
int os=find(s),ot=find(t);
if(os==ot)
return false;
if(Vertex[os].ans>Vertex[ot].ans)
Vertex[ot].par=os;
else
Vertex[os].par=ot;
if(Vertex[os].ans==Vertex[ot].ans)
Vertex[ot].ans++;
return true;
}
int main()
{
int n,i,j,sum,ct,k,c;
while(scanf("%d",&n)!=EOF)
{
for(i=1;i<=n;i++)
{
Vertex[i].par=i;
Vertex[i].ans=0;
}
k=0;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
scanf("%d",&c);
if(i<j)
{
edge[k].u=i;
edge[k].v=j;
edge[k].weight=c;
k++;
}
}
qsort(edge,k,sizeof(edge[1]),cmp);
sum=0;ct=0;
for(i=0;i<k&&ct<n-1;i++)
{
if(union_set(edge[i].u,edge[i].v))
{
ct++;
sum+=edge[i].weight;
}
}
printf("%d\n",sum);
}
return 0;
}