Problem p03205 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
#define to edge[i].v
#define mp make_pair
#define rint register int
#define debug(x) cerr << #x << "=" << x << endl
#define fgx cerr << "-------------" << endl
#define N 100010
#define T n + n + 1
#define add(x, y, z) addedge(x, y, z), addedge(y, x, 0)
using namespace std;
typedef long long ll;
typedef long double db;
typedef pair<int, int> pii;
int head[N], tot = 1, cur[N], vis[N], dis[N], n, p[N], fa[N], s;
vector<int> v[N];
struct Edge {
  int v, next, f, w;
} edge[N * 10];
queue<int> q;
inline void addedge(int x, int y, int z) {
  edge[++tot] = Edge{y, head[x], 0, z};
  head[x] = tot;
}
inline int bfs() {
  memset(vis, 0, sizeof(vis));
  memcpy(cur, head, sizeof(cur));
  q.push(0);
  vis[0] = 1;
  while (!q.empty()) {
    int x = q.front();
    q.pop();
    for (rint i = head[x]; i; i = edge[i].next)
      if (!vis[to] && edge[i].f < edge[i].w)
        dis[to] = dis[x] + 1, vis[to] = 1, q.push(to);
  }
  return vis[T];
}
int dfs(int x, int res) {
  if (x == T || !res)
    return res;
  int flow = 0, f;
  for (rint &i = cur[x]; i; i = edge[i].next)
    if (dis[to] == dis[x] + 1 &&
        (f = dfs(to, min(res, edge[i].w - edge[i].f)))) {
      edge[i].f += f;
      edge[i ^ 1].f -= f;
      res -= f;
      flow += f;
      if (!res)
        break;
    }
  return flow;
}
inline int dinic() {
  int A = 0;
  while (bfs())
    A += dfs(0, INT_MAX);
  return A;
}
void dfs(int x) {
  vis[x] = 1;
  s++;
  for (auto y : v[x])
    if (!vis[p[y]])
      fa[y] = x, dfs(p[y]);
}
int main() {
  int m, x;
  cin >> n;
  for (rint i = 1; i <= n; i++)
    add(n + i, T, 1);
  for (rint i = 1; i < n; add(0, i, 1), i++)
    for (scanf("%d", &m); m--;) {
      scanf("%d", &x), v[x].push_back(i);
      if (x != 1)
        add(i, n + x, 1);
    }
  if (dinic() != n - 1)
    return !printf("-1");
  for (rint j = 1; j < n; j++)
    for (rint i = head[j]; i; i = edge[i].next)
      if (n < to && to <= n + n && edge[i].f)
        p[j] = to - n;
  dfs(1);
  if (s != n)
    return !printf("-1");
  for (rint i = 1; i < n; i++)
    printf("%d %d\n", fa[i], p[i]);
  return 0;
}


Fixed submission:
#include <bits/stdc++.h>
#define to edge[i].v
#define mp make_pair
#define rint register int
#define debug(x) cerr << #x << "=" << x << endl
#define fgx cerr << "-------------" << endl
#define N 200010
#define T n + n + 1
#define add(x, y, z) addedge(x, y, z), addedge(y, x, 0)
using namespace std;
typedef long long ll;
typedef long double db;
typedef pair<int, int> pii;
int head[N], tot = 1, cur[N], vis[N], dis[N], n, p[N], fa[N], s;
vector<int> v[N];
struct Edge {
  int v, next, f, w;
} edge[N * 10];
queue<int> q;
inline void addedge(int x, int y, int z) {
  edge[++tot] = Edge{y, head[x], 0, z};
  head[x] = tot;
}
inline int bfs() {
  memset(vis, 0, sizeof(vis));
  memcpy(cur, head, sizeof(cur));
  q.push(0);
  vis[0] = 1;
  while (!q.empty()) {
    int x = q.front();
    q.pop();
    for (rint i = head[x]; i; i = edge[i].next)
      if (!vis[to] && edge[i].f < edge[i].w)
        dis[to] = dis[x] + 1, vis[to] = 1, q.push(to);
  }
  return vis[T];
}
int dfs(int x, int res) {
  if (x == T || !res)
    return res;
  int flow = 0, f;
  for (rint &i = cur[x]; i; i = edge[i].next)
    if (dis[to] == dis[x] + 1 &&
        (f = dfs(to, min(res, edge[i].w - edge[i].f)))) {
      edge[i].f += f;
      edge[i ^ 1].f -= f;
      res -= f;
      flow += f;
      if (!res)
        break;
    }
  return flow;
}
inline int dinic() {
  int A = 0;
  while (bfs())
    A += dfs(0, INT_MAX);
  return A;
}
void dfs(int x) {
  vis[x] = 1;
  s++;
  for (auto y : v[x])
    if (!vis[p[y]])
      fa[y] = x, dfs(p[y]);
}
int main() {
  int m, x;
  cin >> n;
  for (rint i = 1; i <= n; i++)
    add(n + i, T, 1);
  for (rint i = 1; i < n; add(0, i, 1), i++)
    for (scanf("%d", &m); m--;) {
      scanf("%d", &x), v[x].push_back(i);
      if (x != 1)
        add(i, n + x, 1);
    }
  if (dinic() != n - 1)
    return !printf("-1");
  for (rint j = 1; j < n; j++)
    for (rint i = head[j]; i; i = edge[i].next)
      if (n < to && to <= n + n && edge[i].f)
        p[j] = to - n;
  dfs(1);
  if (s != n)
    return !printf("-1");
  for (rint i = 1; i < n; i++)
    printf("%d %d\n", fa[i], p[i]);
  return 0;
}