/*
TASK:wireless
LANG:C
*/

//#define DEBUG

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//#include <process.h>

#define IN      "wireless.in"
#define OUT     "wireless.out"
#define MAX     4096

long max_time=1.8*(double)CLOCKS_PER_SEC;

long n, a, b, c, used[MAX], bestres=0x7fffffff, curres;
long *next[MAX], *data[MAX], num[MAX], done[MAX];

long path[MAX][2], prog;
long res[MAX][2], reslen;

void output()
{
   long i;
   
   printf("%ld %ld\n", reslen, bestres);
   for(i=0; i<reslen; i++)
      printf("%ld %ld\n", res[i][0], res[i][1]);
}

void record()
{
   long i;

   for(i=0; i<prog; i++)
   {
      res[i][0]=path[i][0]+1;
      res[i][1]=path[i][1];
   }

   reslen=prog;
}

void rec(long v)
{
   long i, j;

   if(curres>bestres)
     return;

   if(clock()>max_time)
   {
     output();
     exit(0);
   }

   done[v]=1;
   
   for(i=0; i<num[v]; i++)
   {
      used[next[v][i]]++;
      curres+=data[v][i];

      path[prog][0]=v;
      path[prog][1]=data[v][i];
      prog++;

      if(curres>=bestres)
      {
        prog--;
        curres-=data[v][i];
        break;
      }

      if(used[b]&&used[c])
      {
        record();
        prog--;
        bestres=curres;
        curres-=data[v][i];
        break;
      }

      for(j=0; j<=i; j++)
         if(!done[next[v][i]])
           rec(next[v][i]);

      prog--;
      curres-=data[v][i];
   }

   for(i=0; i<num[v]; i++)
      used[next[v][i]]--;

   done[v]=0;
}

int main()
{
   long i, j;

   clock();
   
#ifdef DEBUG
   freopen(IN, "r", stdin);
   freopen(OUT, "w", stdout);
#endif

   scanf("%ld%ld%ld%ld", &n, &a, &b, &c);a--;b--;c--;
   for(i=0; i<n; i++)
   {
      scanf("%ld", num+i);

      next[i]=(long*)malloc(sizeof(long)*num[i]);
      data[i]=(long*)malloc(sizeof(long)*num[i]);

      for(j=0; j<num[i]; j++)
      {
         scanf("%ld%ld", next[i]+j, data[i]+j);
         next[i][j]--;
      }
   }

   used[a]=1;
   rec(0);

   output();
   
#ifdef DEBUG
   fclose(stdin);
   fclose(stdout);
#endif

   return 0;
}

