1 #include <iostream>
2 #include <cstdio>
3 #include <cmath>
4 #include <cstring>
5 #include <algorithm>
6 #include <queue>
7 #include <stack>
8 #include <vector>
9 #include <iomanip>
10 using namespace std;
11 int next[105][105];
12 int n,m;
13 int g[105][105];
14 void init()
15 {
16 for(int i=0;i<=n;i++)
17 {
18 for(int j=0;j<=n;j++)
19 {
20 if(i==j)
21 g[i][j]=g[j][i]=0;
22 else
23 g[i][j]=g[j][i]=1e9;
24 }
25 }
26 }
27 void printpath()
28 {
29 int st=1,ed=n;
30 while(st!=ed)
31 {
32 printf("%d->",st);
33 st=next[st][ed];
34 }
35 printf("%d",ed);
36 }
37 void floyd()
38 {
39 for(int i=1;i<=n;i++)
40 {
41 for(int j=1;j<=n;j++)
42 {
43 next[i][j]=j;
44 }
45 }
46 for(int k=1;k<=n;k++)
47 {
48 for(int i=1;i<=n;i++)
49 {
50 for(int j=1;j<=n;j++)
51 {
52 if(g[i][j]>g[i][k]+g[k][j])
53 {
54 g[i][j]=g[i][k]+g[k][j];
55 next[i][j]=next[i][k];
56 }
57
58 }
59 }
60 }
61 printf("%d\n",g[1][n]);
62 printpath();
63 }
64 int main(int argc, char *argv[])
65 {
66
67 scanf("%d%d",&n,&m);
68 init();
69 for(int i=0;i<m;i++)
70 {
71 int x,y,w;
72 scanf("%d%d%d",&x,&y,&w);
73 if(g[x][y]>w)
74 g[x][y]=g[y][x]=w;
75 }
76 floyd();
77 return 0;
78 }