#include<bits/stdc++.h>
using namespace std;
const int N = 10010;
#define int long long
int dis[N][2],vis[N],n,m,bz[N],insp[N],ans,sw=1e18;
vector<pair<int,int> > G[N];
void Dijkstra(int x){
int flag=0;
if(x==n) flag=1;
memset(vis,0,sizeof(vis));
memset(bz,0,sizeof(bz));
dis[x][flag]=0;
for(int i=1;i<=n;i++){
int p=0;
for(int j=1;j<=n;j++) if(dis[p][flag]>dis[j][flag]&&!vis[j]) p=j;
vis[p]=1;
for(int k=0;k<G[p].size();k++){
if(dis[G[p][k].first][flag]>dis[p][flag]+G[p][k].second){
bz[G[p][k].first]=k;
dis[G[p][k].first][flag]=dis[p][flag]+G[p][k].second;
}
}
}
}
signed main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int x,y,w;
cin>>x>>y>>w;
G[x].push_back(make_pair(y,w));
G[y].push_back(make_pair(x,w));
}
memset(dis,0x3f,sizeof(dis));
Dijkstra(1);
for(int i=0;i<G[bz[n]].size();i++){
sw=min(sw,G[bz[n]][i].second);
insp[i]=1;
}
Dijkstra(n);
for(int i=0;i<G[bz[1]].size();i++){
insp[i]=1;
}
ans=dis[n][0]+sw*2;
for(int i=1;i<=n;i++){
for(int j=0;j<G[i].size();j++){
if(!insp[i]&&min(dis[G[i][j].first][0]+dis[i][1],dis[G[i][j].first][1]+dis[i][0])+G[i][j].second!=dis[n][0]){
ans=min(ans,min(dis[G[i][j].first][0]+dis[i][1],dis[G[i][j].first][1]+dis[i][0])+G[i][j].second);
}
}
}
cout<<ans;
return 0;
}