#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
struct na{
int y,z,ne;
na(){
ne=0;
}
}b[200001];
struct ma{
int x,t;
};
int x,y,z,p,n,m,num=0,l[5001],r[5001],dis[5001][2];
bool bo[5001][2];
char ch;
inline int read(){
p=0;ch=getchar();
while (ch<‘0‘||ch>‘9‘) ch=getchar();
while (ch>=‘0‘&&ch<=‘9‘) p=p*10+ch-48, ch=getchar();
return p;
}
inline void in(int x,int y,int z){
num++;
if (l[x]==0) l[x]=num;else b[r[x]].ne=num;
b[num].y=y;b[num].z=z;r[x]=num;
}
inline void ins(int x,int y,int z){
in(x,y,z);in(y,x,z);
}
const int INF=1e8;
queue <ma> q;
inline void pu(ma x){
if (!bo[x.x][x.t]){
bo[x.x][x.t]=1;
q.push(x);
}
}
int main(){
register int i;
n=read();m=read();
for (i=1;i<=m;i++){
x=read();y=read();z=read();
ins(x,y,z);
}
for (i=1;i<=n;i++) dis[i][0]=dis[i][1]=INF;
ma cmp;cmp.x=1;cmp.t=0;
q.push(cmp);bo[1][0]=1;dis[1][0]=0;
while(!q.empty()){
ma k=q.front(),cmp;bo[k.x][k.t]=0;
q.pop();
if (k.x==n) continue;
for (i=l[k.x];i;i=b[i].ne){
if (!k.t){
if (dis[b[i].y][0]>dis[k.x][0]+b[i].z) dis[b[i].y][1]=dis[b[i].y][0],dis[b[i].y][0]=dis[k.x][0]+b[i].z,cmp.x=b[i].y,cmp.t=0,pu(cmp);else
if (dis[b[i].y][1]>dis[k.x][0]+b[i].z&&((b[i].y!=n)||(dis[b[i].y][0]!=dis[k.x][0]+b[i].z)))
dis[b[i].y][1]=dis[k.x][0]+b[i].z,cmp.x=b[i].y,cmp.t=1,pu(cmp);
}else
if (dis[b[i].y][1]>dis[k.x][1]+b[i].z&&((b[i].y!=n)||(dis[b[i].y][0]!=dis[k.x][1]+b[i].z)))
dis[b[i].y][1]=dis[k.x][1]+b[i].z,cmp.x=b[i].y,cmp.t=1,pu(cmp);
}
}
printf("%d\n",dis[n][1]);
}