/*
qq:1239198605
ctgu_yyf
*/
#include<iostream>
#include<cstdio>
#include<string>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
struct Edge{
int u,v,cost;
};
Edge edge[10005];
int par[105];
int rank[105];
int n;
int k;
int map[105][105];
void init(int n)
{
for(int i=1;i<=n;i++)
{
par[i]=i;
rank[i]=0;}
}
bool cmp(const Edge &a,const Edge &b)
{
return a.cost<b.cost;
}
int find(int x)
{
if(par[x]==x)
return x;
else
return par[x]=find(par[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])
par[x]=y;
else
{
par[y]=x;
if(rank[x]==rank[y])
rank[x]++;
}
}
int kruskal()
{
sort(edge,edge+k,cmp);
// for(int i=0;i<k;i++)
// cout<<edge[i].u<<" "<<edge[i].v<<" "<<edge[i].cost<<"**"<<endl;
init(n);
int res=0;
for(int i=1;i<k;i++)
{
if(same(edge[i].u,edge[i].v)==false)
{
unite(edge[i].u,edge[i].v);
res=res+edge[i].cost;
}
}
return res;
}
int main()
{
ios::sync_with_stdio(false);
while(cin>>n)
{
k=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
cin>>map[i][j];}
for(int i=1;i<=n-1;i++)
for(int j=i+1;j<=n;j++)
{
edge[k].u=i;
edge[k].v=j;
edge[k++].cost=map[i][j];
}
int ans=kruskal();
cout<<ans<<endl;
}
return 0;
}