Problem p04003 (C++)

Buggy submission (status: Runtime Error):
#include <cctype>
#include <cstdio>
#include <cstring>
#include <map>
#include <queue>
using namespace std;
void read(int &v) {
  int f;
  char ch;
  while (!isdigit(ch = getchar()) && ch != '-')
    ;
  ch == '-' ? (f = -1, v = 0) : (f = 1, v = ch - '0');
  while (isdigit(ch = getchar()))
    v = v * 10 + ch - '0';
  v *= f;
}
const int N = 1e5 + 5, M = 2e5 + 5;
struct sd {
  int next, to, w;
} edge[M << 1];
map<int, int> mp[N];
deque<int> que;
int head[N], dis[N], n, m, cnt, num;
int get(int x, int y) {
  if (mp[x].count(y))
    return mp[x][y];
  return mp[x][y] = ++cnt;
}
void add_edge(int from, int to, int w) {
  edge[++num].next = head[from];
  edge[num].to = to;
  edge[num].w = w;
  head[from] = num;
}
int main() {
  read(n), read(m);
  for (int i = 1; i <= n; i++)
    get(i, 0);
  for (int i = 1; i <= m; i++) {
    int x, y, z;
    read(x), read(y), read(z);
    int x0 = get(x, 0), y0 = get(y, 0), xz = get(x, z), yz = get(y, z);
    add_edge(xz, yz, 0), add_edge(yz, xz, 0);
    add_edge(x0, xz, 1), add_edge(xz, x0, 1);
    add_edge(y0, yz, 1), add_edge(yz, y0, 1);
  }
  memset(dis, -1, sizeof(dis));
  dis[1] = 0;
  que.push_back(1);
  while (!que.empty()) {
    int v = que.front();
    que.pop_front();
    for (int i = head[v]; i; i = edge[i].next) {
      int to = edge[i].to;
      if (dis[to] == -1 || dis[to] > dis[v] + edge[i].w) {
        dis[to] = dis[v] + edge[i].w;
        if (edge[i].w == 1)
          que.push_front(to);
        else
          que.push_back(to);
      }
    }
  }
  printf("%d", dis[n] >> 1);
  return 0;
}

Fixed submission:
#include <cctype>
#include <cstdio>
#include <cstring>
#include <map>
#include <queue>
using namespace std;
void read(int &v) {
  int f;
  char ch;
  while (!isdigit(ch = getchar()) && ch != '-')
    ;
  ch == '-' ? (f = -1, v = 0) : (f = 1, v = ch - '0');
  while (isdigit(ch = getchar()))
    v = v * 10 + ch - '0';
  v *= f;
}
const int N = 5e5 + 5, M = 1e6 + 5;
struct sd {
  int next, to, w;
} edge[M << 1];
map<int, int> mp[N];
deque<int> que;
int head[N], dis[N], n, m, cnt, num;
int get(int x, int y) {
  if (mp[x].count(y))
    return mp[x][y];
  return mp[x][y] = ++cnt;
}
void add_edge(int from, int to, int w) {
  edge[++num].next = head[from];
  edge[num].to = to;
  edge[num].w = w;
  head[from] = num;
}
int main() {
  read(n), read(m);
  for (int i = 1; i <= n; i++)
    get(i, 0);
  for (int i = 1; i <= m; i++) {
    int x, y, z;
    read(x), read(y), read(z);
    int x0 = get(x, 0), y0 = get(y, 0), xz = get(x, z), yz = get(y, z);
    add_edge(xz, yz, 0), add_edge(yz, xz, 0);
    add_edge(x0, xz, 1), add_edge(xz, x0, 1);
    add_edge(y0, yz, 1), add_edge(yz, y0, 1);
  }
  memset(dis, -1, sizeof(dis));
  dis[1] = 0;
  que.push_back(1);
  while (!que.empty()) {
    int v = que.front();
    que.pop_front();
    for (int i = head[v]; i; i = edge[i].next) {
      int to = edge[i].to;
      if (dis[to] == -1 || dis[to] > dis[v] + edge[i].w) {
        dis[to] = dis[v] + edge[i].w;
        if (edge[i].w == 1)
          que.push_front(to);
        else
          que.push_back(to);
      }
    }
  }
  printf("%d", dis[n] >> 1);
  return 0;
}