import java.util.Scanner;
public class Prim {
static int map[][];//图
static int n;//节点个数
static boolean vis[];//标记节点是否在树中
public static void main(String[] args) {
Scanner in =new Scanner(System.in);
n=in.nextInt();//节点数
map=new int[n][n];
vis=new boolean[n];
for (int i=0;i<n;i++){
for (int j=0;j<n;j++){
map[i][j]=in.nextInt();
}
}
prim(0);
}
//prim方法,最小生成树算法
//v节点值
public static void prim(int v){
vis[v]=true;
//记录即将连接的两个点的坐标
int h1=-1;
int h2=-1;
//总共要构建n-1条边连接n个顶点
for (int k=1;k<n;k++){
int minlen=Integer.MAX_VALUE;
for (int i=0;i<n;i++){
for (int j=0;j<n;j++){
//!!!!!!!!!如果你的两个点未连接的在矩阵中的值是-1或者Integer.MAX_VALUE,你要将下列map[i][j]!=0简单修改
if (vis[i]&&!vis[j]&&map[i][j]!=0&&map[i][j]<minlen){
//替换minlen(寻找已经访问过的节点和未访问节点的之间最短的边)
minlen=map[i][j];
h1=i;
h2=j;
}
}
}
System.out.println("边"+k+": "+h1+"--->"+h2+"距离:"+minlen);
vis[h2]=true;
}
}
}