#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <queue>
#include <stack>
#include <vector>
#include <iomanip>
#include <map>
using namespace std;
const int mmax=200;
struct node{
int a,b,price;
};
int par[mmax],rank[mmax],n;
vector<node>e;
void init()
{
for(int i=0;i<=n;i++)
{
rank[i]=0;
par[i]=i;
}
}
int find(int x)
{
if(par[x]==x)
return x;
else
return par[x]=find(par[x]);
}
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]++;
}
}
bool cmp(node a,node b)
{
return a.price<b.price;
}
int main(int argc, char *argv[])
{
int ans,cout;
while(scanf("%d",&n)!=EOF)
{
cout=0;
e.clear();
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
int t;
scanf("%d",&t);
if(i!=j)
{
node k;
k.a=i;
k.b=j;
k.price=t;
e.push_back(k);
cout++;
}
}
}
sort(e.begin(),e.end(),cmp);
init();
ans=0;
int ne=0;
for(int i=0;i<cout;i++)
{
if(find(e[i].a)!=find(e[i].b))
{
unite(e[i].a,e[i].b);
ans+=e[i].price;
ne++;
}
}
if(ne==n-1)
printf("%d\n",ans);
else
printf("-1\n");
}
return 0;
}