#include<iostream> //最小生成树。
#include<cstring>
using namespace std;
int arr[303][303]; //链接矩阵。从一开始。 要想推导出路径来也是可以的。
int flag[303]; //用于标记在不在vnew中。
int lowcost[303];
int N;
const int inf=1e9+10;
int main()
{
cin>>N;
for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++)
{
int abc;
cin>>abc;
if(abc==0)
arr[i][j]=inf;
else
arr[i][j]=abc;
}
memset(flag,0,sizeof(flag));
flag[1]=1;
for(int i=1;i<=100;i++)
lowcost[i]=100;
for(int i=1;i<=N;i++)
lowcost[i]=arr[1][i];
int sum=0;
for(int i=2;i<=N;i++) //仅仅只是进行了n-1次。那自然也是不能浪费。
{
int themin=inf;
int k;
for(int j=1;j<=N;j++)
{
if(flag[j]==0&&lowcost[j]<themin)
{
themin=lowcost[j]; //找出最小的来。
k=j;
}
}
sum=sum+themin;
flag[k]=1; //都是针对于这一个k的,所以说k还是很关键的。
for(int j=1;j<=N;j++)
if(arr[k][j]<lowcost[j])
lowcost[j]=arr[k][j];
}
cout<<"最小生成树的长度为:"<<sum<<endl;
return 0;
}