#include<bits/stdc++.h>
using namespace std;
#define int long long
int head[100005],vis[100005];
int dis[200005],dis2[200005];
int n,m,k,tot=0;
struct node{
int to,nxt,d;
}edge[100005];
struct point{
int dd,p;
bool operator<(const point & x) const{
return dd>x.dd;
}
};
void add(int x,int y,int z)
{
edge[tot].to=y;
edge[tot].d=z;
edge[tot].nxt=head[x];
head[x]=tot++;
}
void dijkstra()
{
for(int i=1;i<=n;i++)
{
dis[i]=1e18;
dis2[i]=1e18;
}
dis[1]=0;
memset(vis,0,sizeof(vis));
priority_queue<point> q;
point a;
a.dd=0;
a.p=k;
q.push(a);
while(!q.empty())
{
a=q.top();
q.pop();
int x=a.p;
if(a.dd>dis2[x])
{
continue;
}
for(int i=head[x];i!=-1;i=edge[i].nxt)
{
int y=edge[i].to;
if(dis[y]>dis[x]+edge[i].d)
{
dis2[y]=dis[y];
dis[y]=dis[x]+edge[i].d;
a.dd=dis[y];
a.p=y;
q.push(a);
}
if(dis2[y]>dis[x]+edge[i].d&&dis[y]<dis[x]+edge[i].d)
{
dis2[y]=dis[x]+edge[i].d;
a.dd=dis2[y];
a.p=y;
q.push(a);
}
if(dis2[y]>dis2[x]+edge[i].d)
{
dis2[y]=dis2[x]+edge[i].d;
a.dd=dis2[y];
a.p=y;
q.push(a);
}
}
}
}
signed main()
{
cin>>n>>m;
k=1;
memset(head,-1,sizeof(head));
for(int i=1;i<=m;i++)
{
int u,v,w;
cin>>u>>v>>w;
add(u,v,w);
}
dijkstra();
cout<<dis2[n];
return 0;
}