/*
TASK:wireless
LANG:C++
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define vbig 999999999
#define ch 4000
#define mil 1000000

struct connection{
  short a, b;
  long w;
};

short N, A, B, C, path[ch], abp[ch], acp[ch], bcp[ch], cbp[ch];
long c, c2, k, cc, paths[ch], ab, ac, bc, cb, v1, v2, v3, p1, p2, np;
connection cons[mil];

int cmp(const void *a, const void *b)
{
  if(((connection*)a)->a < ((connection*)b)->a)
    return -1;
  if(((connection*)a)->a > ((connection*)b)->a)
    return 1;
  return 0;
}

long findcon(short a)
{
  long l = 0, r = cc-1, tmp;
  tmp = (l+r)/2;
  while(l <= r)
  {
    tmp = (l+r)/2;
    if(cons[tmp].a == a)
    {
      while(tmp >= 0)
      {
	tmp--;
	if(cons[tmp].a != a)
	  return tmp+1;
      }
      return tmp;
    }
    if(a < cons[tmp].a)
      r = tmp-1;
    if(a > cons[tmp].a)
      l = tmp+1;
  }
  return 0;
}

long findpath(short a, short b)
{
  long cp, tmp;
  if(paths[a] != 0)
    return paths[a];
  if(a == b)
    return 0;
  paths[a] = vbig;
  for(cp = findcon(a); cons[cp].a == a; cp++)
  {
    tmp = findpath(cons[cp].b, b) + cons[cp].w;
    if(tmp<paths[a])
    {
      paths[a] = tmp;
      path[a] = cons[cp].b;
    }
  }
  return paths[a];
}

long dist(short a, short b)
{
  long tmp = findcon(a);
  while(cons[tmp].b != b)
    tmp++;
  return (cons[tmp].w);
}

int main(void)
{
  scanf("%hd %hd %hd %hd", &N, &A, &B, &C);
  for(c = cc = 0; c < N; c++)
  {
    scanf("%ld", &k);
    for(c2 = 0; c2 < k; c2++)
    {
      cons[cc].a = c+1;
      scanf("%hd %ld", &cons[cc].b, &cons[cc].w);
      cc++;
    }
  }
  memset(paths, 0, ch*4);
  memset(path, 0, ch*2);
  ab = findpath(A, B);
  memcpy(abp, path, ch*2);

  memset(paths, 0, ch*4);
  memset(path, 0, ch*2);
  ac = findpath(A, C);
  memcpy(acp, path, ch*2);

  memset(paths, 0, ch*4);
  memset(path, 0, ch*2);
  bc = findpath(B, C);
  memcpy(bcp, path, ch*2);

  memset(paths, 0, ch*4);
  memset(path, 0, ch*2);
  cb = findpath(C, B);
  memcpy(cbp, path, ch*2);

  v1 = ab+bc;
  v2 = ac+cb;

  for(v3 = 0, p2 = A; acp[p2] == abp[p2] && p2 != B && p2 != C;)
  {
    v3 += dist(p2, abp[p2]);
    p2 = abp[p2];
  }
  for(p1 = p2; p1 != B;)
  {
    v3 += dist(p1, abp[p1]);
    p1 = abp[p1];
  }
  for(; abp[p2] != B;)
  {
    v3 += dist(p2, abp[p2]);
    p2 = abp[p2];
  }

  if(v1 <= v2 && v1 <= v3)
  {
    for(np = 0, p1 = A; p1 != B;)
    {
      p1 = abp[p1];
      np++;
    }
    for(p2 = B; p2 != C;)
    {
      p2 = bcp[p2];
      np++;
    }
    printf("%ld %ld\n", np, v2);
    for(p1 = A; p1 != B;)
    {
      printf("%hd ", p1);
      printf("%ld\n", dist(p1, abp[p1]));
      p1 = abp[p1];
    }
    for(p2 = B; p2 != C;)
    {
      printf("%hd ", p2);
      printf("%ld\n", dist(p2, bcp[p2]));
      p2 = bcp[p2];
    }
  }

  if(v2 < v1 && v2 <= v3)
  {
    for(np = 0, p1 = A; p1 != C;)
    {
      p1 = acp[p1];
      np++;
    }
    for(p2 = C; p2 != B;)
    {
      p2 = cbp[p2];
      np++;
    }
    printf("%ld %ld\n", np, v2);
    for(p1 = A; p1 != C;)
    {
      printf("%hd ", p1);
      printf("%ld\n", dist(p1, acp[p1]));
      p1 = acp[p1];
    }
    for(p2 = C; p2 != B;)
    {
      printf("%hd ", p2);
      printf("%ld\n", dist(p2, cbp[p2]));
      p2 = cbp[p2];
    }
  }

  if(v3 < v1 && v3 < v2)
  {
    for(np = 0, p2 = A; acp[p2] == abp[p2] && p2 != B && p2 != C;)
    {
      np++;
      p2 = abp[p2];
    }
    for(p1 = p2; p1 != B;)
    {
      np++;
      p1 = abp[p1];
    }
    for(; abp[p2] != B;)
    {
      np++;
      p2 = abp[p2];
    }
    printf("%ld %ld\n", np, v3);
    for(np = 0, p2 = A; acp[p2] == abp[p2] && p2 != B && p2 != C;)
    {
      printf("%hd ", p2);
      printf("%ld\n", dist(p2, cbp[p2]));
      p2 = abp[p2];
    }
    for(p1 = p2; p1 != B;)
    {
      printf("%hd ", p1);
      printf("%ld\n", dist(p1, cbp[p1]));
      p1 = abp[p1];
    }
    for(; abp[p2] != B;)
    {
      printf("%hd ", p2);
      printf("%ld\n", dist(p2, cbp[p2]));
      p2 = abp[p2];
    }
  }
  return 0;
 }