CSES - Shared codeLink to this code: https://cses.fi/paste/63266e6ff8d247946099cf/
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
#define int ll
#define endl '\n'

const ll mod = 1000000007;
const int inf = INT64_MAX;

signed main()
{
    int n, m;
    cin >> n >> m;

    unordered_map<int, vector<pair<int, int>>> graph;

    for (int i = 0; i < m; i++)
    {
        int u, v, w;
        cin >> u >> v >> w;
        graph[u].push_back(make_pair(v, w));
    }

    vector<vector<int>> dist(n + 1, vector<int>(2, inf));

    priority_queue<tuple<int, int, int>, vector<tuple<int, int, int>>, greater<tuple<int, int, int>>> pq;
    pq.push(make_tuple(0, 1, 0));

    while (!pq.empty())
    {
        int cur_dist, city, used;
        tie(cur_dist, city, used) = pq.top();
        pq.pop();

        if (cur_dist > dist[city][used])
        {
            continue;
        }

        for (const auto &neighbor : graph[city])
        {
            int v = neighbor.first;
            int w = neighbor.second;

            if (used == 0)
            { // try using the ticket
                int new_cost = cur_dist + w / 2;
                if (new_cost < dist[v][1])
                {
                    dist[v][1] = new_cost;
                    pq.push(make_tuple(new_cost, v, 1));
                }
            }

            int new_cost = cur_dist + w;
            if (new_cost < dist[v][used])
            {
                dist[v][used] = new_cost;
                pq.push(make_tuple(new_cost, v, used));
            }
        }
    }

    cout << dist[n][1] << endl;

    return 0;
}