###题意:求最小生成树的权值和。
#include <cstdio>
#include <cctype>
#include <climits>
using namespace std;
int a[101][101],lowcost[101]; bool v[101];
inline int in(){
char x=getchar(); int ans=0;
while (!isdigit(x)) x=getchar();
while (isdigit(x)) ans=ans*10+x-48,x=getchar();
return ans;
}
int main(){
int n,k,min,s=0; n=in();
for (int i=1;i<=n;i++){
for (int j=1;j<=n;j++) a[i][j]=in();
lowcost[i]=a[1][i];//从第一个点到其他点的最小值
} v[1]=1;
for (int i=1;i<=n-1;i++){
min=INT_MAX;
for (int j=1;j<=n;j++)
if (lowcost[j]<min&&!v[j]){//求最小值
min=lowcost[j];
k=j;
}
s+=min;
v[k]=1;//加入集合
for (int j=1;j<=n;j++) if (a[k][j]<lowcost[j]) lowcost[j]=a[k][j];//更新最小值
}
printf("%d",s); return 0;
}