#include<bits/stdc++.h>
using namespace std;
int n,m,dis[1111111],head[1111111],tot;
bool vis[1111111];
vector<int> v[1111111];
struct Edge{
int next;
int to;
int w;
}edge[1111111];
void add(int x,int y,int w){
tot++;
edge[tot].to=y;
edge[tot].w=w;
edge[tot].next=head[x];
head[x]=tot;
return;
}
priority_queue<pair<int,int> > q;
set<int> s;
void dijskra(){
while(q.size()){
int x=q.top().second;
q.pop();
if(vis[x]!=0)continue;
else vis[x]=1;
for(int i=head[x];i;i=edge[i].next){
int y=edge[i].to;
int w=edge[i].w;
if(y==n){
s.insert(dis[x]+w);
}
if(dis[x]+w<dis[y]){
dis[y]=dis[x]+w;
q.push(make_pair(-dis[y],y));
v[y]=v[x];
v[y].push_back(i);
}
}
}
return;
}
int main(){
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=1;i<=m;i++){
int x,y,z;
cin>>x>>y>>z;
add(x,y,z);
add(y,x,z);
}
memset(dis,0x3f,sizeof dis);
dis[1]=0;
q.push(make_pair(0,1));
dijskra();
for(int i=0;i<v[n].size();i++){
s.insert(dis[n]+edge[v[n][i]].w*2);
}
auto it=s.begin();
it++;
cout<<*it;
return 0;
}