Problem p04003 (C++)

Buggy submission (status: Runtime Error):
#include <cstdio>
#include <utility>
#include <vector>
static const int MAXN = 1e5 + 3;
static const int MAXM = 2e5 + 3;
static const int MAXC = 1e6 + 2;
static const int INF = 0x3fffffff;

int n, m;
std::vector<std::pair<int, int>> c[MAXC];

int ey_sz;
std::vector<int> ex[MAXN], ey[MAXN + MAXM];

int bfs_ct = 0;
int vis[MAXN] = {0};
inline void bfs_renew() { bfs_ct++; }
inline void bfs_x(int u) {
  if (vis[u] == bfs_ct)
    return;

  static int q[MAXN], qhead, qtail;
  qhead = 0, qtail = 1;
  vis[u] = bfs_ct;
  q[0] = u;

  while (qhead < qtail) {
    u = q[qhead++];
    for (int v : ex[u])
      if (vis[v] != bfs_ct) {
        vis[v] = bfs_ct;
        q[qtail++] = v;
      }
  }

  // for (int i = 0; i < qtail; ++i) printf(" %d", q[i]); putchar('\n');
  int idx = ey_sz++;
  for (int i = 0; i < qtail; ++i) {
    ey[q[i]].push_back(idx);
    ey[idx].push_back(q[i]);
  }
}

int dist[MAXN + MAXM];
inline void bfs_y(int u) {
  for (int i = 0; i < ey_sz; ++i)
    dist[i] = INF;
  static int q[MAXN + MAXM], qhead, qtail;
  qhead = 0, qtail = 1;
  vis[u] = bfs_ct;
  q[0] = u;
  dist[u] = 0;

  while (qhead < qtail) {
    u = q[qhead++];
    for (int v : ey[u])
      if (vis[v] != bfs_ct) {
        vis[v] = bfs_ct;
        q[qtail++] = v;
        dist[v] = dist[u] + 1;
      }
  }
}

int main() {
  scanf("%d%d", &n, &m);
  int u, v, w;
  for (int i = 0; i < m; ++i) {
    scanf("%d%d%d", &u, &v, &w);
    --u, --v, --w;
    c[w].push_back(std::make_pair(u, v));
  }

  std::vector<int> verts;
  ey_sz = n;
  for (int i = 0; i < MAXC; ++i)
    if (!c[i].empty()) {
      for (auto e : c[i]) {
        ex[e.first].push_back(e.second);
        ex[e.second].push_back(e.first);
        verts.push_back(e.first);
        verts.push_back(e.second);
      }
      bfs_renew();
      for (int u : verts)
        bfs_x(u);
      for (int u : verts)
        ex[u].clear();
      verts.clear();
    }

  bfs_renew();
  bfs_y(0);
  printf("%d\n", dist[n - 1] == INF ? -1 : dist[n - 1] / 2);

  return 0;
}


Fixed submission:
#include <cstdio>
#include <utility>
#include <vector>
static const int MAXN = 2e6 + 3;
static const int MAXM = 2e6 + 3; // ◡ ヽ(`Д´)ﾉ ┻━┻
static const int MAXC = 1e6 + 2;
static const int INF = 0x3fffffff;

int n, m;
std::vector<std::pair<int, int>> c[MAXC];

int ey_sz;
std::vector<int> ex[MAXN], ey[MAXN + MAXM];

int bfs_ct = 0;
int vis[MAXN] = {0};
inline void bfs_renew() { bfs_ct++; }
inline void bfs_x(int u) {
  if (vis[u] == bfs_ct)
    return;

  static int q[MAXN], qhead, qtail;
  qhead = 0, qtail = 1;
  vis[u] = bfs_ct;
  q[0] = u;

  while (qhead < qtail) {
    u = q[qhead++];
    for (int v : ex[u])
      if (vis[v] != bfs_ct) {
        vis[v] = bfs_ct;
        q[qtail++] = v;
      }
  }

  // for (int i = 0; i < qtail; ++i) printf(" %d", q[i]); putchar('\n');
  int idx = ey_sz++;
  for (int i = 0; i < qtail; ++i) {
    ey[q[i]].push_back(idx);
    ey[idx].push_back(q[i]);
  }
}

int dist[MAXN + MAXM];
inline void bfs_y(int u) {
  for (int i = 0; i < ey_sz; ++i)
    dist[i] = INF;
  static int q[MAXN + MAXM], qhead, qtail;
  qhead = 0, qtail = 1;
  vis[u] = bfs_ct;
  q[0] = u;
  dist[u] = 0;

  while (qhead < qtail) {
    u = q[qhead++];
    for (int v : ey[u])
      if (vis[v] != bfs_ct) {
        vis[v] = bfs_ct;
        q[qtail++] = v;
        dist[v] = dist[u] + 1;
      }
  }
}

int main() {
  scanf("%d%d", &n, &m);
  int u, v, w;
  for (int i = 0; i < m; ++i) {
    scanf("%d%d%d", &u, &v, &w);
    --u, --v, --w;
    c[w].push_back(std::make_pair(u, v));
  }

  std::vector<int> verts;
  ey_sz = n;
  for (int i = 0; i < MAXC; ++i)
    if (!c[i].empty()) {
      for (auto e : c[i]) {
        ex[e.first].push_back(e.second);
        ex[e.second].push_back(e.first);
        verts.push_back(e.first);
        verts.push_back(e.second);
      }
      bfs_renew();
      for (int u : verts)
        bfs_x(u);
      for (int u : verts)
        ex[u].clear();
      verts.clear();
    }

  bfs_renew();
  bfs_y(0);
  printf("%d\n", dist[n - 1] == INF ? -1 : dist[n - 1] / 2);

  return 0;
}