#include<algorithm>
#include<iostream>
#include<iomanip>
#include<cstring>
#include<vector>
#include<cmath>
#include<stack>
#include<queue>
#include<map>
#include<set>
#define MAXN 10005
#define MAXNN 1000005
using namespace std;
struct node {
int x;
int y;
int v;
}edge[MAXNN];
int n,m,edge_cnt=0,ans,cnt;
int fa[MAXN];
bool cmp(node x,node y){
if(x.v>y.v){
return 0;
}else{
return 1;
}
}
int find(int gu){
if(fa[gu]==gu){
return gu;
}else{
fa[gu]=find(fa[gu]);
return fa[gu];
}
}
void unionn(int x,int y){
int xx=find(x);
int yy=find(y);
fa[xx]=yy;
}
int main() {
cin>>n;
m=n*n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
int x;
cin>>x;
if(x){
edge_cnt++;
edge[edge_cnt].x=i;
edge[edge_cnt].y=j;
edge[edge_cnt].v=x;
}
}
}
for(int i=1;i<=n;i++){
fa[i]=i;
}
sort(edge+1,edge+1+m,cmp);
for(int i=1;i<=m;i++){
int xx=find(edge[i].x);
int yy=find(edge[i].y);
if(xx==yy){
;
}else{
unionn(edge[i].x,edge[i].y);
ans+=edge[i].v;
cnt++;
if(cnt==n-1){
break;
}
}
}
cout<<ans;
return 0;
}