#include <bits/stdc++.h>
#define int long long
using namespace std;
const int M=1e5+5;
const int N=5e3+5;
const int mod=1e9+7;
const int INF=0x3f3f3f3f;
inline int read(){
char ch=getchar();
int f=1,x=0;
while(ch<'0'||ch>'9'){
if(ch=='-')f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=x*10+(ch-'0');
ch=getchar();
}
return f*x;
}
inline void write(int x){
if(x<0){
putchar('-');
x=-x;
}
if(x>9)write(x/10);
putchar(x%10+'0');
return ;
}
int n,m;
struct edge{
int to,w;
};
vector <edge> G[M];
int dis[N][2],vis[N];
void dijkstra(int x){
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > q;
q.push({0,x});
for(int i=1;i<=n;i++)dis[i][0]=dis[i][1]=INF;
dis[x][0]=0;
while(!q.empty()){
int u=q.top().second;q.pop();
if(vis[u])continue;
vis[u]=1;
if(dis[u][0]>dis[u][1])continue;
for(int i=0;i<G[u].size();i++){
int v=G[u][i].to,w=G[u][i].w;
int nl=w+dis[u][0];
if(nl<dis[v][0]){
dis[v][1]=dis[v][0],dis[v][0]=nl;
q.push(make_pair(dis[v][0],v));
}
else if(nl<dis[v][1]&&nl>dis[v][0]){
dis[v][1]=nl;
q.push(make_pair(dis[v][1],v));
}
}
}
}
signed main(){
n=read(),m=read();
for(int i=1,u,v,w;i<=m;i++){
u=read(),v=read(),w=read();
G[u].push_back({v,w});
G[v].push_back({u,w});
}dijkstra(1);
write(dis[n][1]);
return 0;
}