#include<iostream>
using namespace std;
#define maxSize 99
#define inf 999
typedef struct
{
int no;
char info;
}VertexType;
typedef struct
{
int edges[maxSize][maxSize];
int n,e;
VertexType vex[maxSize];
}MGraph;
void printPath(int u,int v,int path[][maxSize])
{
if(path[u][v]==-1)
cout<<v<<" ";
else
{
int mid=path[u][v];
printPath(u,mid,path);
printPath(mid,v,path);
}
}
void Floyd(MGraph g,int path[][maxSize])
{
int i,j,k;
int A[maxSize][maxSize];
for(int i=0;i<g.n;++i)
for(int j=0;j<g.n;++j)
{
A[i][j]=g.edges[i][j];
path[i][i]=-1;
}
for(int k=0;k<g.n;++k)
for(int i=0;i<g.n;++i)
for(int j=0;j<g.n;++j)
if(A[i][j]>A[i][k]+A[k][j])
{
A[i][j]=A[i][k]+A[k][j];
path[i][j]=k;
}
}
/*4 8
0 1 5 0 3 7
1 2 4 1 3 2
2 0 3 2 1 3 2 3 2
3 2 1*/
int main()
{
MGraph g;
int path[maxSize][maxSize];
cin>>g.n>>g.e;
for(int i=0;i<g.n;++i)
for(int j=0;j<g.n;++j)
{
path[i][j]=-1;
g.edges[i][j]=inf;
if(i==j)
g.edges[i][j]=0;
}
for(int i=0;i<g.e;++i)
{
int u,v,w;
cin>>u>>v>>w;
g.edges[u][v]=w;
}
Floyd(g,path);
int u=1,v=0;
cout<<"最短路徑爲:"<<endl<<u<<" ";
printPath(u,v,path);
}