import java.util.Scanner;
public class 最小生成树 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
long[][] b = new long[a][a];
for (int i = 0; i < a; i++) {
for (int j = 0; j < a; j++) {
b[i][j] = sc.nextLong();
}
}
f(b);
System.out.println(sum);
}
static int sum = 0;
private static void f(long[][] b) {
Long[] c = new Long[b[0].length];
int t = 0;
for (int i = 0; i < b[0].length; i++) {
c[i] = b[0][i];
}
for (int i = 1; i < b.length; i++) {
long min = 100000;
for (int j = 0; j < b[i].length; j++) {
if (c[j] > 0 && c[j] < 100000) {
if (c[j] < min) {
t = j;
min = c[j];
}
}
}
System.out.println("找到节点" + t + "权值为" + min);
sum += min;
c[t] = (long) 0;
for (int j = 0; j < b[i].length; j++) {
if (b[t][j] > 0 && b[t][j] < 100000) {
if (b[t][j] < c[j])
c[j] = b[t][j];
}
}
}
}
}
public class 最小生成树 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
long[][] b = new long[a][a];
for (int i = 0; i < a; i++) {
for (int j = 0; j < a; j++) {
b[i][j] = sc.nextLong();
}
}
f(b);
System.out.println(sum);
}
static int sum = 0;
private static void f(long[][] b) {
Long[] c = new Long[b[0].length];
int t = 0;
for (int i = 0; i < b[0].length; i++) {
c[i] = b[0][i];
}
for (int i = 1; i < b.length; i++) {
long min = 100000;
for (int j = 0; j < b[i].length; j++) {
if (c[j] > 0 && c[j] < 100000) {
if (c[j] < min) {
t = j;
min = c[j];
}
}
}
System.out.println("找到节点" + t + "权值为" + min);
sum += min;
c[t] = (long) 0;
for (int j = 0; j < b[i].length; j++) {
if (b[t][j] > 0 && b[t][j] < 100000) {
if (b[t][j] < c[j])
c[j] = b[t][j];
}
}
}
}
}