#include <iostream>
#include <cstring>
#define MAXI 105
#define INF 0x3f3f3f
using namespace std;
int a[MAXI][MAXI]; //无向图
int dist[MAXI]; //到各个点的最短路径
int n,m; //顶点数和边数
int prev[MAXI]; //路径
void Dijkstra(int v0)
{
bool s[MAXI]; //顶点集合
for(int i=1;i<=n;i++) //初始化
{
s[i]=false;
dist[i]=a[v0][i];
if(a[v0][i]<INF)
prev[i]=v0;
else
prev[i]=-1;
}
dist[v0]=0;
s[v0]=true;
for(int i=2;i<=n;i++)
{
int u=v0;
int maxx=INF;
for(int j=1;j<=n;j++)
if(!s[j]&&dist[j]<maxx)
{
u=j;
maxx=dist[j];
}
s[u]=true;
for(int j=1;j<=n;j++)
{
if(!s[j]&&a[u][j]<INF)
{
if(dist[j]>dist[u]+a[u][j])
{
dist[j]=dist[u]+a[u][j];
prev[j]=u;
}
}
}
}
}
void creat()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
a[i][j]=INF;
for(int i=1;i<=n;i++)
a[i][i]=0;
}
int main()
{
int t;
int w,u,v;
cin>>n>>m;
creat();
for(int i=0;i<m;i++)
{
cin>>u>>v>>w;
a[u][v]=w;
a[v][u]=w;
}
Dijkstra(1);
for(int i=1;i<=n;i++)
cout<<dist[i]<<" ";
t=7;
while(t!=1)
{
cout<<prev[t]<<"->";
t=prev[t];
}
return 0;
}
/*
7 12
1 2 7
1 3 9
1 6 14
2 3 10
2 4 15
3 4 11
3 6 2
4 5 6
5 6 9
7 4 7
7 5 5
7 6 3
*/