#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
#define inf 0x3f3f3f3f
const int maxn=1e2+9;
int mp[maxn][maxn],n,vis[maxn];
struct node{
int val,p;
bool operator <(const node &a)const{
return val>a.val;
}
};
void prim(int v){
priority_queue<node>q;
for(int i=1;i<=n;i++){
if(i==v)continue;
q.push({mp[v][i],i});
}
int cnt=0,sum=0;
cnt++;
vis[v]=1;
while(!q.empty()&&cnt<n){
int u=q.top().p;
if(vis[u]){
q.pop();
continue;
}
vis[u]=1;
sum+=q.top().val;
cnt++;
q.pop();
for(int i=1;i<=n;i++){
if(vis[i]||i==u)continue;
q.push({mp[u][i],i});
}
}
cout<<sum<<endl;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
int i,j,k;
while(cin>>n){
memset(vis,0,sizeof(vis));
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
cin>>mp[i][j];
}
}
prim(1);
}
}