#include <cstdio>
#include <cstdlib>
const int MAXN = 50;		// 最大顶点数
const int INF = 1000000000;	// 作为标记的无穷大值
int mat[MAXN][MAXN];		// 无向图的邻接矩阵
int mind[MAXN]; 			// 辅助数组
int v[MAXN];				// 标记顶点是否被访问过的数组
int n;						// 顶点的个数
int prim() {
	int ret = 0, i, j, k;
	for (i = 0; i<n; i++) {
		mind[i] = INF;
		v[i] = 0;
	}
	for (mind[j = 0] = 0; j < n; j++) {
		for (k = -1, i = 0; i < n; i++) {
			if (!v[i] && (k == -1 || mind[i] < mind[k])) {
				k = i;
			}
		}
		v[k] = 1;
		ret += mind[k];
		for (i = 0; i < n; i++) {
			if (!v[i] && mat[k][i] < mind[i]) {
				mind[i] = mat[k][i];
			}
		}
	}
	return ret;
}
int main() {
	scanf("%d", &n);
	for (int i = 0;i < n;i++) {
	// 读入无向图的邻接矩阵
		for (int j = 0;j < n;j++) {
			scanf("%d", &mat[i][j]);
			if (mat[i][j] == 0)
				mat[i][j] = INF;
		}
	}
	printf("%d\n", prim());
	return 0;
}
/**************************************************************
	Problem: 2162
	User: admin
	Language: C++
	Result: Accepted
	Time:8 ms
	Memory:1156 kb
****************************************************************/