/*
TASK: wireless
LANG: C
*/

#include<stdio.h>
#include<stdlib.h>
#define mx 4096
#define maxx 199999999
#define in stdin;//fopen("c:\\a\\wire.in","r")
FILE*fn;
int c,src,a,b;
int q1,q2;
int c1,c2,c3,c4,c5,c6,c7,c8;
int ca,cb;
int ns[mx];
int*nei[mx];
int*k[mx];
int d[mx];
int dop[mx];
int p[mx];
int nc[mx];
int v[mx];
int sort[mx];
int best=maxx;
int bk,bt;
int ans[mx];
int ans2[mx];
int dij(int a)
  {int q1,q2,c1,c2;
  for(q1=0;q1<c;q1++){v[q1]=0;d[q1]=maxx;p[q1]=-1;nc[q1]=-1;}
  d[a]=0;
  for(q1=0;q1<c;q1++)
    {c2=maxx;
    for(q2=0;q2<c;q2++)if(!v[q2])if(d[q2]<c2)
      {c2=d[q2];
      c1=q2;}
    v[c1]=1;
    if(c2>best)break;
    for(q2=0;q2<ns[c1];q2++)
      if(k[c1][q2]+d[c1]<d[nei[c1][q2]])
        {d[nei[c1][q2]]=k[c1][q2]+d[c1];
        p[nei[c1][q2]]=c1;
        nc[nei[c1][q2]]=q2;}}
  return 0;}
int cmp(const void*a,const void*b)
  {int c1=*((int*)a);
  int c2=*((int*)b);
  return d[c1]-d[c2];}
int main()
  {fn=in;
  fscanf(fn,"%d %d %d %d",&c,&src,&a,&b);
  src--;
  a--;
  b--;
  for(q1=0;q1<c;q1++)
    {fscanf(fn,"%d",&c1);
    ns[q1]=c1;
    nei[q1]=(int*)malloc(ns[q1]*sizeof(int)+32);
    k[q1]=(int*)malloc(ns[q1]*sizeof(int)+32);
    for(q2=0;q2<ns[q1];q2++)
      {fscanf(fn,"%d %d",&c1,&c2);
      c1--;
      nei[q1][q2]=c1;
      k[q1][q2]=c2;}}
  fclose(fn);
  dij(src);
  for(q1=0;q1<c;q1++)dop[q1]=d[q1];
  for(q1=0;q1<c;q1++)sort[q1]=q1;
  qsort(sort,c,sizeof(sort[0]),cmp);
  for(q2=0;q2<c;q2++)if(d[sort[q2]]<best)
    {q1=sort[q2];
    dij(q1);
    if((!v[a])||(!v[b]))continue;
    ca=cb=c5=c6=0;
    c1=a;
    if(c1!=q1){while(1)
      {ca+=k[p[c1]][nc[c1]];
      c5++;
      if(p[c1]==q1)break;
      c1=p[c1];}
    c3=k[p[c1]][nc[c1]];
    c7=c1;}
    else {c7=q1;c3=0;}

    c1=b;
    if(c1!=q1){while(1)
      {cb+=k[p[c1]][nc[c1]];
      c6++;
      if(p[c1]==q1)break;
      c1=p[c1];}
    c4=k[p[c1]][nc[c1]];
    c8=c1;     }
    else {c8=c1;c4=0;}
    if(c7==c8)continue;

    if(c3<c4)c4=c3;
    if(best>ca+cb+dop[q1]-c4)
      {best=ca+cb+dop[q1]-c4;
      bk=q1;
      bt=c5+c6-1;
      if(a==q1||b==q1)bt++;}
    }
  dij(src);
  c1=bk;
  c6=0;
  while(1)
    {ans[c6++]=nc[c1];
    if(p[c1]==src)break;
    c1=p[c1];}
  printf("%d %d\n",bt+c6,best);

  c2=src;
  if(bk!=src)for(q1=c6-1;q1>=0;q1--)
    {printf("%d %d\n",c2+1,k[c2][ans[q1]]);
    c2=nei[c2][ans[q1]];
    }

  dij(bk);

  c5=c6=0;
    c1=a;
    if(c1!=bk)while(1)
      {
      ans[c5++]=nc[c1];
      if(p[c1]==bk)
        {
        c3=k[p[c1]][nc[c1]];
        break;}
      c1=p[c1];}
    else c3=maxx;
    c1=b;
    if(c1!=bk)while(1)
      {
      ans2[c6++]=nc[c1];
      if(p[c1]==bk)
        {
        c4=k[p[c1]][nc[c1]];
        break;}
      c1=p[c1];}
    else c4=maxx;

  if(c3<c4)c4=c3;

  printf("%d %d\n",bk+1,c4);


  c2=bk;
  if(a!=bk)for(q1=c5-1;q1>=0;q1--)
    {if(q1!=c5-1)printf("%d %d\n",c2+1,k[c2][ans[q1]]);
    c2=nei[c2][ans[q1]];
    }

  c2=bk;
  if(b!=bk)for(q1=c6-1;q1>=0;q1--)
    {if(q1!=c6-1)printf("%d %d\n",c2+1,k[c2][ans2[q1]]);
    c2=nei[c2][ans2[q1]];
    }



  return 0;}
