#include <bits/stdc++.h>
#define f0(i, n) for(int i=0; i<n; i++)
#define f1(i, n) for(int i=1; i<=n; i++)
#define fi first
#define se second
#define pb push_back
#define el cout << "\n";
#define sz(A) (int)A.size()
#define FOR(i, l, r) for (int i = l; i <= r; i++)
#define FOD(i, r, l) for (int i = r; i >= l; i--)
#define all(x) x.begin(), x.end()
#define faster                       \
    ios_base::sync_with_stdio(false); \
    cin.tie(NULL);                     \
    cout.tie(NULL);
#define AWA signed main()
using namespace std;
typedef long long ll;
typedef pair<ll, ll> ii;
typedef unsigned long long ull;
typedef string str;
typedef vector<int> vi;
const int maxn=1000002;
const int mod=1000000007;
const ll inf = 1e18;
#define bit(mask, i) ((mask>>i)&1)
#define lon(x) ((1ll) << (x))
template <class X, class Y>
    bool maximize(X &x, const Y&y)
    {
        if(x<y)
        {
            x=y;
            return true;
        }
        else return false;
    }
template <class X, class Y>
    bool minimize(X &x, const Y&y)
    {
        if(x>y)
        {
            x=y;
            return true;
        }
        else return false;
    }
void file()
{
      #define TASK "INCGRAPH"
    if(fopen(TASK".INP", "r"))
    {
        freopen(TASK".INP", "r", stdin);
        freopen(TASK".OUT", "w", stdout);
    }
}
int n, m;
ll eu[maxn], ev[maxn], ew[maxn], Max[maxn];
vector<ii>adj[maxn];
struct Data{
    ll dis[maxn];
    void dijkstra(int s){
        FOR(i, 1, n) dis[i] = inf;
        dis[s] = 0;
        priority_queue<ii, vector<ii>, greater<ii>> pq;
        pq.push(make_pair(dis[s], s));
        while(sz(pq)){
            ii top = pq.top(); pq.pop();
            int dd = top.fi, u = top.se;
            for(ii it: adj[u]){
                int v = it.fi, w = it.se;
                if(dis[v] > dis[u] + w){
                    dis[v] = dis[u] + w;
                    pq.push(make_pair(dis[v], v));
                }
            }
        }
    }
}d1, dn;
int low[maxn], num[maxn], timer = 0;
bool contain[maxn];
vector<ii> g[maxn];
bool ok = 0;
void dfs(int s, int pre, ll mid){
    if(s == n) contain[s] = 1;
    low[s] = num[s] = ++timer;
    for(ii it: g[s]){
        int v = it.fi, id = it.se;
        if(id == pre) continue;
        if(!num[v]){
            dfs(v, id, mid); 
            contain[s] |= contain[v];
            low[s] = min(low[s], low[v]);
            if(low[v] == num[v] && contain[v]){
                if(d1.dis[eu[id]] + dn.dis[ev[id]] + ew[id] == d1.dis[n] && d1.dis[eu[id]] + dn.dis[ev[id]] + ew[id] + Max[id] >= d1.dis[n] + mid){
                    ok = 1;
                }
            }
        }
        else low[s] = min(low[s], num[v]);
    }
}
bool check(ll mid){
    FOR(i, 1, n){
        g[i].clear();
        low[i] = num[i] = 0; 
        contain[i] = 0;
    }
    timer = 0; 
    ok = 0;
    f0(i, m){
        ll u = eu[i], v = ev[i], w = ew[i];
        if(d1.dis[u] + dn.dis[v] + ew[i] < d1.dis[n] + mid) 
            g[u].pb(make_pair(v, i)), g[v].pb(make_pair(u, i));
        else if(d1.dis[v] + dn.dis[u] + ew[i] < d1.dis[n] + mid) 
            g[u].pb(make_pair(v, i)), g[v].pb(make_pair(u, i));
    }
    dfs(1, -1, mid);
    return(ok);
}
AWA
{
    faster;
    file();
    cin>>n>>m;
    f0(i, m){
        cin >> eu[i] >> ev[i] >> ew[i];
        adj[eu[i]].pb(make_pair(ev[i], ew[i])); 
        adj[ev[i]].pb(make_pair(eu[i], ew[i]));
    }
    for(int i = m - 2; i >= 0; i--){
        Max[i] = max(Max[i + 1], ew[i + 1]);
    }
    d1.dijkstra(1); 
    dn.dijkstra(n);
    f0(i, m){
        if(d1.dis[eu[i]] > d1.dis[ev[i]]) swap(eu[i], ev[i]);
    }
    ll l = 1, r = *max_element(ew + 1, ew + m + 1), ans = 0;
    while(l <= r){
        ll mid = (l + r) >> 1;
        if(check(mid))
        {
            ans = mid; 
            l = mid + 1;
        }
        else r = mid - 1;
    }
    cout << d1.dis[n] + ans;
    return 0;
}
Compilation message (stderr)
Aesthetic.cpp: In function 'void file()':
Aesthetic.cpp:54:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   54 |         freopen(TASK".INP", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
Aesthetic.cpp:55:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   55 |         freopen(TASK".OUT", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |