#include<iostream>
using namespace std;
const int N=110;
const int INF=0x3f3f3f3f;
int g[N][N],dist[N];
bool st[N];
int main()
{
int n;cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>g[i][j];
memset(dist,0x3f,sizeof dist);
int ans=0;
for(int i=0;i<n;i++) //每次回选到一个点
{
int t=-1; //记录需扩展的点
for(int j=1;j<=n;j++) if(!st[j]&&(t==-1||dist[t]>dist[j])) t=j; //在未选择的点内找到一个距已生成的树最近的点
//标记该店已被扩展到树内
st[t]=true;
//若该点不能到达,则直接返回。
// i 因为第一个点时,树还未生成,没有边长,所以第一个i点不执行下列语句
if(i&&dist[t]==INF)
{
cout<<INF<<endl;
return 0;
}
//同上,第一个点不进行添加
if(i) ans+=dist[t];
//更新其余点对于树的距离。
//这里不进行判断点是否在树内,是因为即使在树内的点被更改了距离也无所谓,以后不会再用到
for(int j=1;j<=n;j++) dist[j]=min(dist[j],g[t][j]);
}
cout<<ans<<endl;
return 0;
}