1 #include<algorithm>
2 #include <iostream>
3 #include <cstdlib>
4 #include <cstring>
5 #include <climits>
6 #include <cstdio>
7 #include <string>
8 #include <cmath>
9 #include <stack>
10 #include <deque>
11
12 using namespace std;
13 const int INF=1<<30;
14 const int gg=200000 + 11;
15 int head[gg];
16 int dis[gg];
17 int n,m;
18 int cnt;
19 bool vis[gg];
20 int sum,tot;
21 struct node{
22 int net;
23 int to;
24 int w;
25 }a[gg];
26
27 inline void add(int i,int j,int w)
28 {
29 a[++cnt].to=j;
30 a[cnt].net=head[i];
31 a[cnt].w=w;
32 head[i]=cnt;
33 }
34
35 inline void spfa(int s)
36 {
37 deque<int>q;
38 for(int i=1;i<=n;i++)
39 dis[i]=INF;
40 dis[s]=0;
41 vis[s]=true;
42 q.push_back(s);
43 tot=1;
44 while(!q.empty())
45 {
46 int u=q.front();
47 q.pop_front();
48 vis[u]=false;
49 tot--;
50 sum-=dis[u];
51 for(int i=head[u];~i;i=a[i].net)
52 {
53 int v=a[i].to;
54 if(dis[v]>dis[u]+a[i].w)
55 {
56 dis[v]=dis[u]+a[i].w;
57 if(!vis[v])
58 {
59 vis[v]=true;
60 if(q.empty()||dis[v]>dis[q.front()]||dis[v]*tot<=sum)
61 q.push_back(v);
62 tot++;
63 sum+=dis[v];
64 }
65 }
66 }
67 }
68 }
69
70 int main()
71 {
72 memset(head,-1,sizeof(head));
73 cin>>n>>m;
74 for(int i=1;i<=m;i++)
75 {
76 int a,b,c;
77 cin>>a>>b>>c;
78 add(a,b,c);
79 add(b,a,c);
80 }
81 spfa(1);
82 if(dis[n]==INF)
83 {
84 cout<<-1<<endl;
85 return 0;
86 }
87 else
88 {
89 cout<<dis[n]<<endl;
90 }
91 return 0;
92 }