#include<bits/stdc++.h>
using namespace std;
#include<limits.h>
#define maxn 100
#define max1 1000
int parent[maxn];
int lowcost[maxn];
typedef struct {
int arc[maxn][maxn];
int ver[maxn];
int vernum,arcnum;
}Graph;
int Init(Graph *G)
{
for(int i=0;i<=maxn;i++)
{
for(int j=0;j<=maxn;j++)
{
(*G).arc[i][j] = max1;
}
}
return 0;
}
int Create(Graph *G)
{
int m;
scanf("%d",&(*G).vernum);
int n=(*G).vernum;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
scanf("%d",&m);
if(m!=0)
{
(*G).arc[i][j] = m;
}
}
}
return 0;
}
int find(int a[],int x)
{
int min = INT_MAX,k,f=0;
for(int i=1;i<=x;i++)
{
if(a[i]<min&&a[i]!=0)
{
f=1;
min = a[i];
k=i;
}
}
if(f==0||min==max1)
{
return -1;
}
else
{
return k;
}
}
int prim(Graph G,int u)
{
int sum=0,k=u;
int n=G.vernum ;
for(int i=1;i<=n;i++)
{
lowcost[i] = G.arc[k][i];
parent[i] = k;
}
//for(int i=1;i<=n;i++)
// printf("%d ",lowcost[i]);
lowcost[k] = 0;
parent[k] = -1;
for(int i=2;i<=n;i++)
{
k = find(lowcost,n);
//printf("\n\n%d\n",k);
if(k == -1)
{
return -1;
}
sum += lowcost[k];
//printf("%d\n",sum);
lowcost[k] = 0;
for(int j=1;j<=n;j++)
{
if(G.arc[k][j] < lowcost[j] && lowcost[j]!=0)
{
lowcost[j] = G.arc[k][j];
parent[j] = k;
}
}
}
//printf("%d",sum);
return sum;
}
int main()
{
Graph G;
Init(&G);
Create(&G);
int cnt;
cnt = prim(G,1);
printf("%d",cnt);
return 0;
}