import java.util.Scanner;
public class Main
{
public static void main(String[] args)throws Exception
{
Scanner sc=new Scanner(System.in);
int N=sc.nextInt();
int P=sc.nextInt();
int[][] d=new int[N+1][N+1];//记录节点之间的关系,花费的时间
for(int i=1;i<N+1;i++) //初始化
{
for(int j=1;j<N+1;j++)
{
if(i==j)d[i][j]=0;
else d[i][j]=9999;
}
}
for(int i=0;i<P;i++) //赋值
{
int s=sc.nextInt();
int e=sc.nextInt();
int l=sc.nextInt();
d[s][e]=d[e][s]=l;
}
sc.close();
//prim 最小生成树算法
int[] lowcost=new int[N+1];//标记最近的相邻节点的距离lowcost[j]为与最近的距离值
int[] closest=new int[N+1];//标记与j最近点的值
boolean[] s=new boolean[N+1];//判断j点是否被选择过
s[1]=true;//从1点开始
for(int i=2;i<N+1;i++)
{
lowcost[i]=d[1][i];
closest[i]=1;
s[i]=false;
}
for(int i=1;i<N;i++) //第N个点因为k的值可以为N ,所以无需重复考虑
{
int min=9999;
int j=1;
for(int k=2;k<N+1;k++)
{
if(!s[k]&&lowcost[k]<min){min=lowcost[k];j=k;} //k点距离1点距离最短
}
closest[i]=j;
s[j]=true;
for(int k=2;k<N+1;k++)
{
if(!s[k]&&d[j][k]<lowcost[k]){lowcost[k]=d[j][k];closest[j]=k;}
}
}
for(int i=1;i<N+1;i++)
{
System.out.println(closest[i]);
}
}
}