/*
TASK: wireless
LANG: C
*/

#include <stdio.h>
#include <stdlib.h>

#define MAXN            4096
#define MAXR            1000010

#define INF             2000000000

typedef struct s1
{
  int ind;
  int val;
} tnasl;

int n;
int fr,to1,to2;
int brn[MAXN];
tnasl *nasl[MAXN];
int vis[MAXN];
int par[MAXN][2];
long long dist[MAXN];
long long distall[MAXN];
int parall[MAXN][2];
long long dist1[MAXN];
int par1[MAXN][2];
long long dist2[MAXN];
int par2[MAXN][2];
long long min;
int mind;
int bropp[MAXN];
tnasl *oppn[MAXN];
int ans[MAXN*2][2];
int brans;
int brr1,brr2;
int beg[MAXN];

void input()
{
  int i,i2;
  tnasl tmp;

  scanf("%d %d %d %d",&n,&fr,&to1,&to2);

  for(i=0;i<=n;i++)
    bropp[i] = 0;

  brr1 = 0;

  for(i=1;i<=n;i++)
  {
    scanf("%d",&brn[i]);
    nasl[i] = (tnasl*)malloc((brn[i]+1)*sizeof(tnasl));

    for(i2=0;i2<brn[i];i2++)
    {
      scanf("%d %d",&nasl[i][i2].ind,&nasl[i][i2].val);
      bropp[nasl[i][i2].ind]++;
    }
  }

  for(i=1;i<=n;i++)
  {
    oppn[i] = (tnasl*)malloc((bropp[i]+3)*sizeof(tnasl));
    bropp[i] = 0;
  }

  for(i=1;i<=n;i++)
    for(i2=0;i2<brn[i];i2++)
    {
      tmp = nasl[i][i2];
      oppn[tmp.ind][bropp[tmp.ind]].ind = i;
      oppn[tmp.ind][bropp[tmp.ind]++].val = tmp.val;
    }
}

void Dijkstra(int num)
{
  int i;
  int min,mind;
  long long tmp,reb;

  for(i=0;i<=n;i++)
  {
    dist[i] = INF;
    vis[i] = 0;
    par[i][0] = -1;
  }
  
  dist[num] = 0;
  par[num][0] = -1;

  while(1)
  {
    min = INF;
    mind = -1;
  
    for(i=1;i<=n;i++)
      if(!vis[i] && dist[i]<min)
      {
        min = dist[i];
        mind = i;
      }

    if(mind==-1)
      break;

    vis[mind] = 1;

    for(i=0;i<brn[mind];i++)
    {
      tmp = nasl[mind][i].ind;
      reb = nasl[mind][i].val;

      if(dist[tmp]>dist[mind]+reb)
      {
        dist[tmp] = dist[mind]+reb;
        par[tmp][0] = mind;
        par[tmp][1] = reb;
      }
    }
  }
  
}


void Dijkstra2(int num)
{
  int i;
  int min,mind;
  long long tmp,reb;

  for(i=0;i<=n;i++)
  {
    dist[i] = INF;
    vis[i] = 0;
    par[i][0] = -1;
  }
  
  dist[num] = 0;
  par[num][0] = -1;
  par[num][1] = 0;

  while(1)
  {
    min = INF;
    mind = -1;
  
    for(i=1;i<=n;i++)
      if(!vis[i] && dist[i]<min)
      {
        min = dist[i];
        mind = i;
      }

    if(mind==-1)
      break;

    vis[mind] = 1;

    for(i=0;i<bropp[mind];i++)
    {
      tmp = oppn[mind][i].ind;
      reb = oppn[mind][i].val;

      if(dist[tmp]>dist[mind]+reb)
      {
        dist[tmp] = dist[mind]+reb;
        par[tmp][0] = mind;
        par[tmp][1] = reb;
      }
    }
  }
  
}



void solve()
{
  int i;
  long long sum;
  int p1,p2;
  long long tmp[2*MAXN][2];
  int cur;
  int minrazk;

  Dijkstra(fr);

  for(i=1;i<=n;i++)
  {
    distall[i] = dist[i];
    parall[i][0] = par[i][0];
    parall[i][1] = par[i][1];
  }


  Dijkstra2(to1);
  for(i=1;i<=n;i++)
  {
    dist1[i] = dist[i];
    par1[i][0] = par[i][0];
    par1[i][1] = par[i][1];
  }
  
  Dijkstra2(to2);
  for(i=1;i<=n;i++)
  {
    dist2[i] = dist[i];
    par2[i][0] = par[i][0];
    par2[i][1] = par[i][1];
  }

  min = INF;
  mind = -1;

  for(i=1;i<=n;i++)   // v tozi da se razdeliat
  {
    sum = distall[i]+dist1[i]+dist2[i];
    p1 = par1[i][1];
    p2 = par2[i][1];

    if(par1[i][0]!=par2[i][0])
    {
      if(p1>p2)
        sum -= p2;
      else
        sum -= p1;
    }

    if(sum<min)
    {
      min = sum;
      mind = i;      
    }
  }

  brans = 0;

  cur = mind;

  while(parall[cur][0]!=-1 && cur!=-1)
  {
    tmp[brans][0] = parall[cur][0];
    tmp[brans][1] = parall[cur][1];
    brans++;
    cur = parall[cur][0];
  }

  for(i=brans-1;i>=0;i--)
  {
    ans[brans-1-i][0] = tmp[i][0];
    ans[brans-1-i][1] = tmp[i][1];
  }

  ans[brans][0] = mind;

  if(par1[mind][1]>par2[mind][1])
    ans[brans][1] = par1[mind][1];
  else
    ans[brans][1] = par2[mind][1];

  brans++;

  cur = par1[mind][0];

  while(par1[cur][0]!=-1 && cur!=-1)
  {
    ans[brans][0] = par1[cur][0];
    ans[brans][1] = par1[cur][1];
    brans++;
    cur = par1[cur][0];
  }
    
  cur = par2[mind][0];

  while(par2[cur][0]!=-1 && cur!=-1)
  {
    ans[brans][0] = par2[cur][0];
    ans[brans][1] = par2[cur][1];
    brans++;
    cur = par2[cur][0];
  }
}

void output()
{
  int i;

  printf("%d %d\n",brans,min);

  for(i=0;i<brans;i++)
    printf("%d %d\n",ans[i][0],ans[i][1]);
}

int main()
{
//  freopen("wireless.in","r",stdin);

  input();
  solve();
  output();

  return 0;
}

