#include<stdio.h> 
#define MAX_VERTEX_NUM 100
int parent[MAX_VERTEX_NUM];
typedef struct  
{  
    int weight;  
    int begin;  
    int end;   
}Edge;
int Find(int *parent,int f)
{
    while(parent[f]>0)
      f=parent[f];
    return f;
}
int main()
{    
     int N,num,k=0,sum=0,m,n;
     
     Edge edges[MAX_VERTEX_NUM*MAX_VERTEX_NUM],temp;
     scanf("%d",&N);
     for(int i=0;i<N;i++)
	 {
	    for(int j=0;j<N;j++)
		{ 
             scanf("%d",&num);  
             if(num!=0&&i<j)  
             {  
                 edges[k].weight=num;  
                 edges[k].begin=i;  
                 edges[k].end=j;  
                 k++;  
             }  
        }  
    }
    for(int i=0;i<k;i++)  
    {  
        for(int j=i;j<k;j++)  
        {  
            if(edges[i].weight>edges[j].weight)  
            {  
                temp.weight=edges[i].weight;  
                temp.begin=edges[i].begin;  
                temp.end=edges[i].end;  
                edges[i].weight=edges[j].weight;  
                edges[i].begin=edges[j].begin;  
                edges[i].end=edges[j].end;  
                edges[j].weight=temp.weight;  
                edges[j].begin=temp.begin;  
                edges[j].end=temp.end;  
            }  
        }  
    }
    for(int i=0;i<N;i++)
    {
        parent[i]=0;
    }
    for(int i=0;i<k;i++)
    {
        n=Find(parent,edges[i].begin);
        m=Find(parent,edges[i].end);
        if(n!=m)
        {
           parent[n]=m;
           sum+=edges[i].weight;
        }
    }
    printf("%d\n",sum);
    return 0;
}  
/**************************************************************
	Problem: 2162
	User: admin
	Language: C
	Result: Accepted
	Time:8 ms
	Memory:1144 kb
****************************************************************/