/*
TASK: wireless
LANG: C
*/

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

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], ans;
int d[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);
    }
  }
}

int min ()  {
  int i, mi, me;

  me = INF;

  for (i = 1; i <= vn; ++i)
    if (!v[i] && me > d[i])  {
      mi = i;
      me = d[i];
    }

  return mi;
}

int dij (int t0, int t1, int p[])  {
  int i, e;
  vex *t;

  memset (v, 0, sizeof(v));
  for (i = 1; i <= vn; ++i)
    d[i] = INF;

  d[t0] = 0;

  for (i = 1; i <= vn; ++i)  {
    e = min ();
    v[e] = 0;
    for (t = vx + e; t -> v != NULL; t = t -> v)
      if (d[t -> v -> d] > d[e] + t -> v -> l)  {
        d[t -> v -> d] = d[e] + t -> v -> l;
        p[t -> v -> d] = e;
      }
  }

  return d[t1];
}

void think ()  {
  int xx, yy;

  xx = dij (t0, t1, p1);
  yy = dij (t0, t2, p2);

  ans = xx + yy;
}

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;
}

