Problem p04003 (C++)

Buggy submission (status: Runtime Error):
#include "bits/stdc++.h"
#include "ext/pb_ds/assoc_container.hpp"
#include "ext/pb_ds/tree_policy.hpp"
using namespace __gnu_pbds;
using namespace std;
typedef long long ll;
#define int long long
#define pb push_back
#define fi first
#define se second
#define fr(i, a, b) for (int i = a; i <= b; i++)
#define all(x) x.begin(), x.end()
#define IO ios ::sync_with_stdio(0), cin.tie(0), cout.tie(0)
#define pii pair<int, int>
#define sz(x) (int)x.size()
const int mod = 1e9 + 7;
// const int mod1 = 998244353;
typedef long double f80;

#ifndef LOCAL
#pragma GCC optimize("O2")
#define endl '\n'
#endif

template <typename T>
using ordered_set =
    tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
int rand(int l, int r) {
  uniform_int_distribution<int> uid(l, r);
  return uid(rng);
}

ll pwr(ll a, ll b, ll mod) {
  a %= mod;
  int ans = 1;
  while (b) {
    if (b & 1)
      ans = (ans * a) % mod;
    a = (a * a) % mod;
    b >>= 1;
  }
  return ans;
}

string to_string(string s) { return '"' + s + '"'; }

string to_string(const char *s) { return to_string((string)s); }

string to_string(bool b) { return (b ? "true" : "false"); }

template <typename A, typename B> string to_string(pair<A, B> p) {
  return "(" + to_string(p.first) + ", " + to_string(p.second) + ")";
}

template <typename A> string to_string(A v) {
  bool first = true;
  string res = "{";
  for (const auto &x : v) {
    if (!first) {
      res += ", ";
    }
    first = false;
    res += to_string(x);
  }
  res += "}";
  return res;
}

void debug_out() { cerr << endl; }

template <typename Head, typename... Tail> void debug_out(Head H, Tail... T) {
  cerr << " " << to_string(H);
  debug_out(T...);
}

#ifdef LOCAL
#define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)
#else
#define debug(...) 42
#endif

void debug1(int a[], int l, int r) {
#ifdef LOCAL
  vector<int> temp(a + l, a + r + 1);
  debug(temp);
#endif
}

const int N = 3e5 + 5;
map<pii, int> m;
int cc = 0;

vector<pii> g[N];
int dist[N];
void add(int p, int q) {
  if (!m.count({p, q})) {
    m[{p, q}] = ++cc;
    dist[cc] = 1e18;
  }
  if (q > 0) {
    int u = m[{p, 0}], v = m[{p, q}];
    g[u].pb({v, 1});
    g[v].pb({u, 0});
  }
}

void solve() {
  int n, mm;
  cin >> n >> mm;
  fr(i, 1, n) { add(i, 0); }
  fr(i, 1, mm) {
    int p, q, r;
    cin >> p >> q >> r;
    add(p, r);
    add(q, r);
    int u = m[{p, r}], v = m[{q, r}];
    g[u].pb({v, 0});
    g[v].pb({u, 0});
  }
  multiset<pii> q;
  int s = m[{1, 0}], t = m[{n, 0}];
  q.insert({0, s});
  dist[s] = 0;
  while (!q.empty()) {
    pii u = (*q.begin());
    q.erase(q.begin());
    for (pii v : g[u.se]) {
      if (dist[v.fi] > dist[u.se] + v.se) {
        dist[v.fi] = dist[u.se] + v.se;
        q.insert({dist[v.fi], v.fi});
      }
    }
  }
  if (dist[t] == 1e18) {
    cout << -1;
    return;
  }
  cout << dist[t];
}

signed main() {
  IO;
#ifdef LOCAL
  freopen("inp.txt", "r", stdin);
  freopen("out.txt", "w", stdout);
#endif
  cout << setprecision(10) << fixed;
  int t = 1;
  // cin >> t;
  fr(tt, 1, t) { solve(); }
  return 0;
}

Fixed submission:
#include "bits/stdc++.h"
#include "ext/pb_ds/assoc_container.hpp"
#include "ext/pb_ds/tree_policy.hpp"
using namespace __gnu_pbds;
using namespace std;
typedef long long ll;
#define int long long
#define pb push_back
#define fi first
#define se second
#define fr(i, a, b) for (int i = a; i <= b; i++)
#define all(x) x.begin(), x.end()
#define IO ios ::sync_with_stdio(0), cin.tie(0), cout.tie(0)
#define pii pair<int, int>
#define sz(x) (int)x.size()
const int mod = 1e9 + 7;
// const int mod1 = 998244353;
typedef long double f80;

#ifndef LOCAL
#pragma GCC optimize("O2")
#define endl '\n'
#endif

template <typename T>
using ordered_set =
    tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
int rand(int l, int r) {
  uniform_int_distribution<int> uid(l, r);
  return uid(rng);
}

ll pwr(ll a, ll b, ll mod) {
  a %= mod;
  int ans = 1;
  while (b) {
    if (b & 1)
      ans = (ans * a) % mod;
    a = (a * a) % mod;
    b >>= 1;
  }
  return ans;
}

string to_string(string s) { return '"' + s + '"'; }

string to_string(const char *s) { return to_string((string)s); }

string to_string(bool b) { return (b ? "true" : "false"); }

template <typename A, typename B> string to_string(pair<A, B> p) {
  return "(" + to_string(p.first) + ", " + to_string(p.second) + ")";
}

template <typename A> string to_string(A v) {
  bool first = true;
  string res = "{";
  for (const auto &x : v) {
    if (!first) {
      res += ", ";
    }
    first = false;
    res += to_string(x);
  }
  res += "}";
  return res;
}

void debug_out() { cerr << endl; }

template <typename Head, typename... Tail> void debug_out(Head H, Tail... T) {
  cerr << " " << to_string(H);
  debug_out(T...);
}

#ifdef LOCAL
#define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)
#else
#define debug(...) 42
#endif

void debug1(int a[], int l, int r) {
#ifdef LOCAL
  vector<int> temp(a + l, a + r + 1);
  debug(temp);
#endif
}

const int N = 5e5 + 5;
map<pii, int> m;
int cc = 0;

vector<pii> g[N];
int dist[N];
void add(int p, int q) {
  if (!m.count({p, q})) {
    m[{p, q}] = ++cc;
    dist[cc] = 1e18;
  }
  if (q > 0) {
    int u = m[{p, 0}], v = m[{p, q}];
    g[u].pb({v, 1});
    g[v].pb({u, 0});
  }
}

void solve() {
  int n, mm;
  cin >> n >> mm;
  fr(i, 1, n) { add(i, 0); }
  fr(i, 1, mm) {
    int p, q, r;
    cin >> p >> q >> r;
    add(p, r);
    add(q, r);
    int u = m[{p, r}], v = m[{q, r}];
    g[u].pb({v, 0});
    g[v].pb({u, 0});
  }
  multiset<pii> q;
  int s = m[{1, 0}], t = m[{n, 0}];
  q.insert({0, s});
  dist[s] = 0;
  while (!q.empty()) {
    pii u = (*q.begin());
    q.erase(q.begin());
    for (pii v : g[u.se]) {
      if (dist[v.fi] > dist[u.se] + v.se) {
        dist[v.fi] = dist[u.se] + v.se;
        q.insert({dist[v.fi], v.fi});
      }
    }
  }
  if (dist[t] == 1e18) {
    cout << -1;
    return;
  }
  cout << dist[t];
}

signed main() {
  IO;
#ifdef LOCAL
  freopen("inp.txt", "r", stdin);
  freopen("out.txt", "w", stdout);
#endif
  cout << setprecision(10) << fixed;
  int t = 1;
  // cin >> t;
  fr(tt, 1, t) { solve(); }
  return 0;
}