#include <iostream>
#include <string.h>
#include <queue>
#include <algorithm>
#include <vector>
using namespace std;
#define N 5005
#define INF 111111111 //无限大表示两边之间没有路径
struct Edge{
int to ,w;
bool operator <(const Edge &a)const{
return w > a.w;
}
};
priority_queue<Edge> Q;
vector<Edge> V[N];
int n, m;
int dis[N], dis2[N];
void init(){
for(int i = 1; i <= n; i++){
V[i].clear();
dis[i] = INF;
dis2[i] = INF;
}
}
int dijkstra(){ //使用dijkstra算法
dis[1] = 0;
Edge p, q, r;
p.to = 1, p.w = 0;
Q.push(p);
while(!Q.empty()){
p = Q.top();
Q.pop();
int u = p.to;
if(p.w > dis2[u])continue;
for(int i = 0; i < V[u].size(); i++){
q = V[u][i];
int to = q.to, d = q.w + p.w;
if(dis[to] > d){
swap(dis[to], d);
r.to = to, r.w = dis[to];
Q.push(r);
}
if(dis[to] < d && dis2[to] > d){
dis2[to] = d;
r.to = to, r.w = d;
Q.push(r);
}
}
}
return dis2[n];
}
int main(){
int a, b, w;
Edge p;
while(cin>>n>>m){
init();
for(int i = 0; i < m; i++){
scanf("%d%d%d", &a, &b, &w);
p.to = b;
p.w = w;
V[a].push_back(p);
p.to = a;
V[b].push_back(p);
}
int len = dijkstra();
cout<<len<<endl;
}
return 0;
}