1 #include<cstdio>
2 #include<cctype>
3 #include<cstring>
4 #include<queue>
5 #include<algorithm>
6 using namespace std;
7 const int N=1e5+10;
8 const int M = 255;
9 inline void read(int &x){
10 int ans=0,f=1;
11 char c=getchar();
12 for(;!isdigit(c);c=getchar()){
13 if(c==‘-‘)
14 f=-1;
15 }
16 for(;isdigit(c);c=getchar()){
17 ans=ans*10+c-‘0‘;
18 }
19 x=ans*f;
20 }
21
22 typedef struct Edge{
23 int to,next,w;
24 }Edge;
25
26 Edge edge[N];
27 Edge e[N] ;
28 int cnt,head[M],dis[M];
29 int Cnt,Head[M],Dis[M];
30 int n,m;
31
32 void add_edge(int u,int v,int w){
33 edge[cnt].to=v;
34 edge[cnt].w=w;
35 edge[cnt].next=head[u];
36 head[u]=cnt++;
37 }
38 void Add_edge(int u,int v,int w){
39 e[Cnt].to=v;
40 e[Cnt].w=w;
41 e[Cnt].next=Head[u];
42 Head[u]=Cnt++;
43 }
44
45 typedef struct Cmp{
46 bool operator () (const int &p1,const int &p2){
47 return dis[p1]<dis[p2];
48 }
49 }Cmp;
50
51 typedef struct cmp{
52 bool operator () (const int &p1,const int &p2){
53 return Dis[p1]<Dis[p2];
54 }
55 }cmp;
56
57 int Dijstra(int k);
58 int dijstra(int k){
59 memset(dis,0x3f,sizeof(dis));
60 dis[k]=0;
61 priority_queue< int ,vector<int> , Cmp > q;
62 q.push(k);
63
64 while(!q.empty()){
65 int u=q.top();
66 q.pop();
67 for(int i=head[u];~i;i=edge[i].next){
68 int v=edge[i].to;
69 if(dis[v]>dis[u]+edge[i].w){
70 dis[v]=dis[u]+edge[i].w;
71 q.push(v);
72 }
73 }
74 }
75
76 //printf("%d\n",dis[n]);
77
78 int W = 0 ;
79 for(int u=1;u<=n;u++){
80 for(int i=head[u];~i;i=edge[i].next){
81 if( dis[u] + edge[i].w == dis[edge[i].to] ){
82 //printf(" %d , %d = %d \n",u,edge[i].to,edge[i].w);
83 Add_edge(u,edge[i].to,edge[i].w);
84 //Add_edge(edge[i].to,u,edge[i].w);
85 W = max ( W , edge[i].w );
86 }
87 }
88 }
89
90 for(int u=1;u<=n;u++){
91 for(int i=head[u];~i;i=edge[i].next){
92 if( dis[u] + edge[i].w != dis[edge[i].to] && dis[u] + edge[i].w - W <= dis[edge[i].to]){
93 //printf(" %d , %d = %d \n",u,edge[i].to,edge[i].w);
94 Add_edge(u,edge[i].to,edge[i].w);
95 //Add_edge(edge[i].to,u,edge[i].w);
96 }
97 }
98 }
99
100 int tmp = dis[n];
101 int maxz = dis[n];
102 for(int u=1;u<=n;u++){
103 for(int i=Head[u];~i;i=e[i].next){
104 //printf(" %d , %d = %d \n",u,e[i].to,e[i].w);
105 e[i].w = e[i].w * 2;
106 //e[i^1].w = e[i^1].w * 2 ;
107 maxz = max(Dijstra(1),maxz);
108 e[i].w = e[i].w / 2;
109 //e[i^1].w = e[i^1].w / 2 ;
110 }
111 }
112 return maxz - tmp ;
113
114 }
115 int Dijstra(int k) {
116 memset(Dis, 0x3f, sizeof(Dis));
117 Dis[k] = 0;
118 priority_queue<int, vector<int>, cmp> q;
119 q.push(k);
120 //printf("### %d\n",Dis[0]);
121 while (!q.empty()) {
122 int u = q.top();
123 q.pop();
124 for (int i = Head[u]; ~i; i = e[i].next) {
125 int v = e[i].to;
126 if (Dis[v] > Dis[u] + e[i].w) {
127 Dis[v] = Dis[u] + e[i].w;
128 q.push(v);
129 //printf(" Dis[%d] , %d\n",v,Dis[v]);
130 }
131 }
132 }
133 //printf("### %d\n",Dis[n]);
134 return Dis[n];
135 }
136 int main()
137 {
138 memset(Head,-1,sizeof(Head));
139 memset(head,-1,sizeof(head));
140 scanf("%d%d",&n,&m);
141
142 for(int i=0,u,v,w;i<m;i++){
143 read(u),read(v),read(w);
144 add_edge(u,v,w);
145 add_edge(v,u,w);
146 }
147 printf("%d\n",dijstra(1));
148
149 return 0;
150 }