#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=5000+10;
const int maxm=200000+10;
const int inf=0x3f3f3f3f;
int d[maxn],d1[maxn],head[maxn],inq[maxn],q[maxn];
int tol=0;
int n,r;
struct Edge
{
int from,to,w,next;
}edge[maxm];
void init()
{
memset(head,-1,sizeof(head));
tol=0;
}
void addedge(int u,int v,int w)
{
edge[tol].from=u,edge[tol].to=v,edge[tol].w=w,edge[tol].next=head[u],head[u]=tol++;
edge[tol].from=v,edge[tol].to=u,edge[tol].w=w,edge[tol].next=head[v],head[v]=tol++;
}
void spfa(int s,int *d)
{
memset(inq,0,sizeof(inq));
memset(q,0,sizeof(q));
for(int i=1;i<=n;i++) d[i]=inf;
d[s]=0,inq[s]=1;
int front=0,rear=0;
q[rear++]=s;
while(front!=rear)
{
int u=q[front++];
inq[u]=0;
if(front>=maxn) front=0;
for(int i=head[u];i!=-1;i=edge[i].next)
{
int v=edge[i].to,w=edge[i].w;
if(d[v]>d[u]+w)
{
d[v]=d[u]+w;
if(inq[v]) continue;
inq[v]=1;
q[rear++]=v;
if(rear>=maxn) rear=0;
}
}
}
}
int main()
{
while(~scanf("%d%d",&n,&r))
{
init();
while(r--)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
addedge(u,v,w);
}
spfa(1,d);
spfa(n,d1);
int ans=d[n],res=inf;
for(int i=0;i<tol;i++)
{
int u=edge[i].from,v=edge[i].to,w=edge[i].w;
if(d[u]+d1[v]+w>ans)
res=min(res,d[u]+d1[v]+w);
}
printf("%d\n",res);
}
}