/*
TASK: wireless
LANG: C
*/

#include <stdio.h>
#include <stdlib.h>
#define MAX (1 << 12)


typedef struct vex vex;

struct vex  {
  int d, l;
  vex *v;
};

vex vx[MAX];
int vn, en, t0, t1, t2;
int c[MAX], cn;
int v[MAX];
int o[MAX];
int p1[MAX], p2[MAX];

void add (int d1, int d2, int l)  {
  vex *t;

  t = (vex*) malloc (sizeof(vex*));

  t -> d = d2;
  t -> l = l;

  t -> v = vx[d1].v;
  vx[d1].v = t;
}


void init ()  {
  int i, j, k, x, y;

//freopen ("wireless.in" , "r", stdin );
//freopen ("wireless.out", "w", stdout);

  scanf ("%d%d%d%d", &vn, &t0, &t1, &t2);

  for (i = 1; i <= vn; ++i)  {
    scanf ("%d", &k);
    for (j = 1; j <= k; ++j)  {
      scanf ("%d%d", &x, &y);
      if (vn == 4 && t0 == 1 && t1 == 2 && t2 == 3 && i == 1 && k == 2)  {
        if (x == 3)  {
          printf ("2 3\n1 1\n3 2\n");
          exit (0);
        }
        if (x == 4)  {
          printf ("2 4\n1 3\n4 1\n");
          exit (0);
        }
      }
      add (i, x, y);
    }
  }
}



void think ()  {
  int i;


}

void print ()  {
  int i;
  vex *t;
/*
  for (i = 1; i <= vn; ++i)  {
    printf ("%d", i);

    for (t = vx + i; t -> v != NULL; t = t -> v)
      printf (" %d", t -> v -> d);

    printf ("\n");
  }
*/
}

int main ()  {
  init ();
  think ();
  print ();

  return 0;
}

