#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
struct edge{
int cost, to;
};
int dis1[N],dis2[N];
vector<edge> g[N];
priority_queue<pair<int,int> >q;
int n,m;
void dij(int s){
memset(dis2,0x3f,sizeof(dis2));
memset(dis1,0x3f,sizeof(dis1));
dis1[1]=0;
q.push({0,1});
while(!q.empty()){
auto t=q.top();
q.pop();
int u=t.second;
for(auto c:g[u]){
int v=c.to,len=c.cost,f=0;
if(dis1[v]>dis1[u]+len) dis2[v]=dis1[v],dis1[v]=dis1[u]+len,f=1;
if(dis1[v]<dis1[u]+len&&dis1[u]+len<dis2[v]) dis2[v]=dis1[u]+len,f=1;
if(dis2[v]>dis2[u]+len) dis2[v]=dis2[u]+len,f=1;
if(f) q.push({dis1[v],v});}}
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int x,y,c;
cin>>x>>y>>c;
g[x].push_back({c,y});
g[y].push_back({c,x});}
dij(1);
cout<<dis2[n];
return 0;
}