#include<bits/stdc++.h>
#pragma optimize O2
using namespace std;
const int N=1010,M=1000010;
unsigned dist[N];
unsigned pred[N],prel[N];
int path[N],cnt;
bool st[N];
unsigned int h[N],e[M],ne[M],w[M],rnk[M],idx;
int n,m;
void add(int a,int b,int c,int i){
e[++idx]=b;
w[idx]=c;
rnk[idx]=i;
ne[idx]=h[a];
h[a]=idx;
}
int ans;
void dij1(){
for(short i=1;i<=n;i++){
dist[i]=0x3f3f3f3f;
st[i]=0;
}
dist[1]=0;
for(short i=1;i<=n;i++){
short t=-1;
for(short j=1;j<=n;j++){
if((!st[j])&&(t==-1||dist[j]<dist[t])) t=j;
}
st[t]=true;
short j;
for(int i=h[t];i;i=ne[i]){
j=e[i];
if(dist[t]+w[i]<dist[j]){
dist[j]=dist[t]+w[i];
pred[j]=t;
prel[j]=rnk[i];
}
}
}
ans=dist[n];
}
void dfs(short u){
path[cnt++]=prel[u];
if(pred[u]!=0){
dfs(pred[u]);
}
}
void dij2(int bad){
for(short i=1;i<=n;i++){
dist[i]=0x3f3f3f3f;
st[i]=0;
}
dist[1]=0;
short t;
for(short i=1;i<=n;i++){
t=-1;
for(short j=1;j<=n;j++){
if(!st[j]&&(t==-1||dist[j]<dist[t])) t=j;
}
st[t]=true;
short j;
for(int i=h[t];i;i=ne[i]){
if(rnk[i]==bad) continue;
j=e[i];
if(dist[t]+w[i]<dist[j]){
dist[j]=dist[t]+w[i];
}
}
}
if(dist[n]>ans) ans=dist[n];
}
int read(){
int x=0;
char ch=getchar();
while(ch<'0'||ch>'9') ch=getchar();
while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+ch-'0';
ch=getchar();
}
return x;
}
int main(){
n=read();m=read();
for(int i=1;i<=m;i++){
int a,b,v;
a=read();b=read();v=read();
if(a==b) continue;
add(a,b,v,i);
add(b,a,v,i);
}
dij1();
dfs(n);
int t=0.9*CLOCKS_PER_SEC;
for(short i=0;i<cnt;i++){
dij2(path[i]);
}
printf("%lld\n",ans);
}
cnt(经过的边数)最大为n-1
理论上O(N^3)卡常能过,但我的不行