#include<iostream>
#include<cstring>
#include<queue>
#include<stack>
using namespace std;
const int N=1010;
stack<int>q;
int n,m;
int g[N][N];
int dist[N];
bool st[N];
int x[10010],y[10010],o=0,path[N];
int mx=-0x3f3f3f3f;
void dijkstra()
{
memset(dist,0x3f,sizeof dist);
memset(st,0,sizeof st);
dist[1]=0;
for(int i=0;i<n;i++)
{
int t=-1;
for(int j=1;j<=n;j++)
{
if(!st[j]&&(t==-1||dist[t]>dist[j]))t=j;
}
st[t]=1;
for(int j=1;j<=n;j++)
{
if(dist[j]>dist[t]+g[t][j])
{
dist[j]=dist[t]+g[t][j];
path[j]=t;
}
}
}
}
void ac()
{
int j;
for(int i=2;i<=n;i++)
{
j=i;
while(path[j]!=-1)
{
q.push(j);
j=path[j];
}
}
q.push(j);
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
memset(g,0x3f,sizeof g);
memset(path,-1,sizeof path);
cin>>n>>m;
while(m--)
{
int a,b,c;
cin>>a>>b>>c;
g[a][b]=c;
g[b][a]=c;
x[++o]=a;
y[o]=b;
}
dijkstra();
ac();
while(q.size())
{
int x1=q.top();
q.pop();
if(q.empty())break;
int y1=q.top();
int qq=g[x1][y1];
g[x1][y1]=0x3f3f3f3f;
g[y1][x1]=0x3f3f3f3f;
dijkstra();
mx=max(mx,dist[n]);
g[x1][y1]=qq;
g[y1][x1]=qq;
}
cout<<mx<<endl;
}