#include<iostream>
#include<algorithm>
using namespace std;
struct point{int x,y,v;};
point a[10001];
int father[101],n,i,j,m,tot,k,x;
int find(int x){
if(father[x]!=x) father[x]=find(father[x]);
return father[x];
}
void unite(int x,int y){
int fx=find(x);
int fy=find(y);
if(fx!=fy)father[fy]=fx;
}
bool cmp(const point &a,const point &b){
if(a.v<b.v)return true;
else return false; }
int main(){
cin>>n;
for(i=1;i<=n;++i){
for(j=1;j<=n;++j){
cin>>x;
if(x!=0){
m++;
a[m].x=i, a[m].y=j, a[m].v=x;
}
}
}
for(i=1;i<=n;++i)father[i]=i;
sort(a+1,a+m+1,cmp);
for(i=1;i<=m;++i){
if(find(a[i].x)!=find(a[i].y)){
unite(a[i].x,a[i].y);
tot+=a[i].v;
k++;
}
if(k==n-1)break;
}
cout<<tot;
return 0;
}