#include <bits/stdc++.h>
#define int long long
#define fast ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
#define lg2(n) (63-__builtin_clzll(n))
#define mask(n) (1LL << (n))
#define TASK ""
#define openfile();  if( fopen(TASK".inp", "r")){freopen(TASK".inp", "r", stdin);freopen(TASK".out", "w", stdout);}
#define lc(n) (n << 1)
#define rc(n) ((n << 1) | 1)

#define fi first
#define se second
#define FOR(i, l, r, k) for( int i = l; i <= r; i += k)
#define FOD(i, r, l, k) for( int i = r; i >= l; i -= k)

#define mii map<int,int>
#define umi unordered_map<int, int>
#define pii pair<int,int>
#define vi vector<int>

using namespace std;

const int oo = 1e18;
const int mod = 1e9 + 7;
const int nmax = 2e5 + 8;
const int base = 31;

int n, m, dis[nmax], dis2[nmax];
vector<pii> g[nmax];

void dijkstra(int u){
    priority_queue<pii, vector<pii>, greater<pii>> pq;
    pq.push({0, u});
    dis[u] = 0;
    while(!pq.empty()){
        auto top = pq.top(); pq.pop();
        if(top.fi > dis2[top.se]) continue;
        for(auto &x : g[top.se]){
            int val = top.fi + x.fi;
            if(val < dis[x.se]){
                pq.push({val, x.se});
                swap(dis[x.se], dis2[x.se]);
                dis[x.se] = val;
            }
            if(val < dis2[x.se] && val > dis[x.se]){
                pq.push({val, x.se});
                swap(val, dis2[x.se]);
            }
        }
    }
}

main(){
    fast;
    openfile();
    cin >> n >> m;
    for(int i = 1; i <= m; ++i){
        int u, v, w;
        cin >> u >> v >> w;
        g[u].push_back({w, v});
        g[v].push_back({w, u});
    }
    memset(dis, 0x3f, sizeof dis);
    memset(dis2, 0x3f, sizeof dis2);
    dijkstra(1);
    cout << dis2[n];
}
