#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=100005,maxm=1000005;
typedef long long LL;
int n,m,tot,h[maxn],e[maxm],next[maxm],len[maxm],pos[maxn],id[maxn];
LL f1[maxn],f2[maxn],ans;
char c;
int read()
{
for (c=getchar();c<'0' || c>'9';c=getchar());
int x=c-48;
for (c=getchar();c>='0' && c<='9';c=getchar()) x=x*10+c-48;
return x;
}
void add(int x,int y,int l)
{
e[++tot]=y; next[tot]=h[x]; len[tot]=l; h[x]=tot;
}
void Up(int x,LL *f)
{
while (x>1 && f[id[x/2]]>f[id[x]])
{
id[x/2]^=id[x]^=id[x/2]^=id[x];
pos[id[x]]=x;
x/=2;
}
pos[id[x]]=x;
}
void Down(int x,LL *f)
{
while (x*2<=tot)
{
int son=(x*2==tot || f[id[x*2]]<f[id[x*2+1]])?x*2:x*2+1;
if (f[id[x]]<=f[id[son]]) break;
id[x]^=id[son]^=id[x]^=id[son];
pos[id[x]]=x;
x=son;
}
pos[id[x]]=x;
}
void Dij(int x,LL *f)
{
for (int i=1;i<=n;i++) f[i]=1e16;
f[x]=0;
tot=1;
id[1]=x; pos[x]=1;
for (int i=1;i<=n;i++) if (i!=x)
{
id[++tot]=i; pos[i]=tot;
}
for (int i=1;i<=n;i++)
{
int x=id[1];
id[1]=id[tot--]; pos[id[1]]=1;
Down(1,f);
for (int j=h[x];j;j=next[j]) if (f[x]+len[j]<f[e[j]])
{
f[e[j]]=f[x]+len[j]; Up(pos[e[j]],f);
}
}
}
int main()
{
freopen("cut.in","r",stdin);
freopen("cut.out","w",stdout);
n=read(); m=read();
while (m--)
{
int x=read(),y=read(),l=read();
add(x,y,l); add(y,x,l);
}
Dij(1,f1); Dij(n,f2);
ans=f1[0]=f2[0]=1e16;
for (int i=h[1];i;i=next[i]) ans=min(ans,f2[e[i]]+1);
for (int i=h[n];i;i=next[i]) ans=min(ans,f1[e[i]]+1);
for (int i=2;i<n;i++)
{
int x=0,y=0;
for (int j=h[i];j;j=next[j])
{
if (f1[e[j]]<f1[x]) x=e[j];
if (f2[e[j]]<f2[y]) y=e[j];
}
ans=min(ans,f1[x]+f2[y]+2);
}
printf("%lld\n",ans);
fclose(stdin); fclose(stdout);
return 0;
}