#include <bits/stdc++.h>
using namespace std;
//variable
#define ld long double
#define ll long long
#define db double
#define ii pair<int,int>
#define f first
#define s second
#define mp make_pair
#define mt make_tuple
//vector
#define pb push_back
#define all(v) v.begin(),v.end()
#define len(a) (int)a.length()
#define sz(a) (int)a.size()
//mask
#define BIT(i) (1LL<<(i))
//better code, debugger
#define watch(n) cerr << #n << ": " << n << endl
#define debug(x) for (auto p: x) cerr<<p<<' ';cerr<<endl
#define forw(i,j,z) for(int i=(int)j;i<=(int)z;i++)
#define ford(i,j,z) for (int i=(int)j;i>=(int)z;i--)
#define fIlE "test."
//auto seed = chrono::high_resolution_clock::now().time_since_epoch().count();
//mt19937 RAND(seed);
const int mod = 1e9 + 7;
inline int add(int u,int v){u+=v;if(u>=mod)u-=mod;return u;}
inline int dec(int u,int v){u-=v;if(u<0)u+=mod;return u;}
inline int mul(int u,int v){return (ll)u*v%mod;}
#define tt pair<ll, int>
const ll inf = 1e16;
int n, m;
vector<ii> a[100000 + 100];
vector<ii> g[100000 + 100];
ll dist1[100000 + 100];
ll distn[100000 + 100];
void solve()
{
cin >> n >> m;
while(m--){
int u, v, d;
cin >> u >> v >> d;
a[u].pb(mp(v, d));
g[v].pb(mp(u, d));
}
priority_queue<tt, vector<tt>, greater<tt> > haha;
forw(i, 1, n)
dist1[i] = inf;
haha.push(mp(dist1[1] = 0, 1));
while(!haha.empty())
{
int u; ll d;
u = haha.top().s, d = haha.top().f;
haha.pop();
if (dist1[u] < d) continue;
for (auto [v, e] : a[u])
{
if (dist1[v] > e + d)
{
dist1[v] = e + d;
haha.push(mp(dist1[v], v));
}
}
}
priority_queue<tt, vector<tt>, greater<tt> > haha2;
forw(i, 1, n)
distn[i] = inf;
haha2.push(mp(distn[n] = 0, n));
while(!haha2.empty())
{
int u; ll d;
u = haha2.top().s, d = haha2.top().f;
haha2.pop();
if (distn[u] < d) continue;
for (auto [v, e] : g[u])
{
if (distn[v] > e + d)
{
distn[v] = e + d;
haha2.push(mp(distn[v], v));
}
}
}
ll ans = inf;
forw(u, 1, n) for (auto [v, e] : a[u])
ans = min(ans, dist1[u] + distn[v] + e / 2);
cout << ans;
}
signed main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
if (fopen(fIlE"inp", "r"))
freopen(fIlE"inp","r",stdin);
if (fopen(fIlE"out", "r"))
freopen(fIlE"out","w",stdout);
//time_t TIME_TU=clock();
int t=1;
// cin>>t;
while(t--)
solve();
//time_t TIME_TV=clock();
//cerr<<(db)(TIME_TV-TIME_TU)/CLOCKS_PER_SEC<<endl;
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci8vdmFyaWFibGUKI2RlZmluZSBsZCBsb25nIGRvdWJsZQojZGVmaW5lIGxsIGxvbmcgbG9uZwojZGVmaW5lIGRiIGRvdWJsZQojZGVmaW5lIGlpIHBhaXI8aW50LGludD4KI2RlZmluZSBmIGZpcnN0CiNkZWZpbmUgcyBzZWNvbmQKI2RlZmluZSBtcCBtYWtlX3BhaXIKI2RlZmluZSBtdCBtYWtlX3R1cGxlCi8vdmVjdG9yCiNkZWZpbmUgcGIgcHVzaF9iYWNrCiNkZWZpbmUgYWxsKHYpIHYuYmVnaW4oKSx2LmVuZCgpCiNkZWZpbmUgbGVuKGEpIChpbnQpYS5sZW5ndGgoKQojZGVmaW5lIHN6KGEpIChpbnQpYS5zaXplKCkKLy9tYXNrCiNkZWZpbmUgQklUKGkpICgxTEw8PChpKSkKLy9iZXR0ZXIgY29kZSwgZGVidWdnZXIKI2RlZmluZSB3YXRjaChuKSBjZXJyIDw8ICNuIDw8ICI6ICIgPDwgbiA8PCBlbmRsCiNkZWZpbmUgZGVidWcoeCkgZm9yIChhdXRvIHA6IHgpIGNlcnI8PHA8PCcgJztjZXJyPDxlbmRsCiNkZWZpbmUgZm9ydyhpLGoseikgZm9yKGludCBpPShpbnQpajtpPD0oaW50KXo7aSsrKQojZGVmaW5lIGZvcmQoaSxqLHopIGZvciAoaW50IGk9KGludClqO2k+PShpbnQpejtpLS0pCiNkZWZpbmUgZklsRSAidGVzdC4iCi8vYXV0byBzZWVkID0gY2hyb25vOjpoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpLnRpbWVfc2luY2VfZXBvY2goKS5jb3VudCgpOwovL210MTk5MzcgUkFORChzZWVkKTsKY29uc3QgaW50IG1vZCA9IDFlOSArIDc7CmlubGluZSBpbnQgYWRkKGludCB1LGludCB2KXt1Kz12O2lmKHU+PW1vZCl1LT1tb2Q7cmV0dXJuIHU7fQppbmxpbmUgaW50IGRlYyhpbnQgdSxpbnQgdil7dS09djtpZih1PDApdSs9bW9kO3JldHVybiB1O30KaW5saW5lIGludCBtdWwoaW50IHUsaW50IHYpe3JldHVybiAobGwpdSp2JW1vZDt9CiNkZWZpbmUgdHQgcGFpcjxsbCwgaW50Pgpjb25zdCBsbCBpbmYgPSAxZTE2OwppbnQgbiwgbTsKdmVjdG9yPGlpPiBhWzEwMDAwMCArIDEwMF07CnZlY3RvcjxpaT4gZ1sxMDAwMDAgKyAxMDBdOwpsbCBkaXN0MVsxMDAwMDAgKyAxMDBdOwpsbCBkaXN0blsxMDAwMDAgKyAxMDBdOwp2b2lkIHNvbHZlKCkKewogICAgY2luID4+IG4gPj4gbTsKICAgIHdoaWxlKG0tLSl7CiAgICAgICAgaW50IHUsIHYsIGQ7CiAgICAgICAgY2luID4+IHUgPj4gdiA+PiBkOwogICAgICAgIGFbdV0ucGIobXAodiwgZCkpOwogICAgICAgIGdbdl0ucGIobXAodSwgZCkpOwogICAgfQogICAgcHJpb3JpdHlfcXVldWU8dHQsIHZlY3Rvcjx0dD4sIGdyZWF0ZXI8dHQ+ID4gaGFoYTsKICAgIGZvcncoaSwgMSwgbikKICAgICAgICBkaXN0MVtpXSA9IGluZjsKICAgIGhhaGEucHVzaChtcChkaXN0MVsxXSA9IDAsIDEpKTsKICAgIHdoaWxlKCFoYWhhLmVtcHR5KCkpCiAgICB7CiAgICAgICAgaW50IHU7IGxsIGQ7CiAgICAgICAgdSA9IGhhaGEudG9wKCkucywgZCA9IGhhaGEudG9wKCkuZjsKICAgICAgICBoYWhhLnBvcCgpOwogICAgICAgIGlmIChkaXN0MVt1XSA8IGQpIGNvbnRpbnVlOwogICAgICAgIGZvciAoYXV0byBbdiwgZV0gOiBhW3VdKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGRpc3QxW3ZdID4gZSArIGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRpc3QxW3ZdID0gZSArIGQ7CiAgICAgICAgICAgICAgICBoYWhhLnB1c2gobXAoZGlzdDFbdl0sIHYpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHByaW9yaXR5X3F1ZXVlPHR0LCB2ZWN0b3I8dHQ+LCBncmVhdGVyPHR0PiA+IGhhaGEyOwogICAgZm9ydyhpLCAxLCBuKQogICAgICAgIGRpc3RuW2ldID0gaW5mOwogICAgaGFoYTIucHVzaChtcChkaXN0bltuXSA9IDAsIG4pKTsKICAgIHdoaWxlKCFoYWhhMi5lbXB0eSgpKQogICAgewogICAgICAgIGludCB1OyBsbCBkOwogICAgICAgIHUgPSBoYWhhMi50b3AoKS5zLCBkID0gaGFoYTIudG9wKCkuZjsKICAgICAgICBoYWhhMi5wb3AoKTsKICAgICAgICBpZiAoZGlzdG5bdV0gPCBkKSBjb250aW51ZTsKICAgICAgICBmb3IgKGF1dG8gW3YsIGVdIDogZ1t1XSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChkaXN0blt2XSA+IGUgKyBkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBkaXN0blt2XSA9IGUgKyBkOwogICAgICAgICAgICAgICAgaGFoYTIucHVzaChtcChkaXN0blt2XSwgdikpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgbGwgYW5zID0gaW5mOwogICAgZm9ydyh1LCAxLCBuKSBmb3IgKGF1dG8gW3YsIGVdIDogYVt1XSkKICAgICAgICBhbnMgPSBtaW4oYW5zLCBkaXN0MVt1XSArIGRpc3RuW3ZdICsgZSAvIDIpOwogICAgY291dCA8PCBhbnM7Cgp9CnNpZ25lZCBtYWluKCkKewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKDApOwogICAgaWYgKGZvcGVuKGZJbEUiaW5wIiwgInIiKSkKICAgICAgICBmcmVvcGVuKGZJbEUiaW5wIiwiciIsc3RkaW4pOwogICAgaWYgKGZvcGVuKGZJbEUib3V0IiwgInIiKSkKICAgICAgICBmcmVvcGVuKGZJbEUib3V0IiwidyIsc3Rkb3V0KTsKICAgIC8vdGltZV90IFRJTUVfVFU9Y2xvY2soKTsKICAgIGludCB0PTE7Ci8vICAgIGNpbj4+dDsKICAgIHdoaWxlKHQtLSkKICAgICAgICBzb2x2ZSgpOwogICAgLy90aW1lX3QgVElNRV9UVj1jbG9jaygpOwogICAgLy9jZXJyPDwoZGIpKFRJTUVfVFYtVElNRV9UVSkvQ0xPQ0tTX1BFUl9TRUM8PGVuZGw7CiAgICByZXR1cm4gMDsKfQo=