/*
TASK:wireless
LANG:C++
*/

#include <stdio.h>

#define maxN 40
#define maxL 150000

long A[maxN+1][maxN+1];
long Dist[maxN+1],VIZ[maxN+1],Back[maxN+1];
int Path1[maxN+1],Path2[maxN+1],M,B,C,N;
int reb[maxN+1][2];

int main()
{
 int i,j,k,p;
 scanf("%d",&N);
 scanf("%d%d%d",&M,&B,&C);
 for (i=1;i<=N;i++)
    for (j=1;j<=N;j++) A[i][j]=maxL;
 for (i=1;i<=N;i++) {
    scanf("%d",&k);
    for (j=1;j<=k;j++) {
	scanf("%d",&p);
	scanf("%ld",&A[i][p]); } }
 for (i=1;i<=N;i++) Dist[i]=maxL;
 Dist[M]=0;
 int v;
 long min;
 for (i=1;i<=N;i++) {
     for (j=1,min=2000000000;j<=N;j++)
	 if (!VIZ[j]&&Dist[j]<min) { min=Dist[j];v=j; }
     VIZ[v]=1;
     for (j=1;j<=N;j++)
	if (Dist[v]+A[v][j]<Dist[j]) {
	    Dist[j]=Dist[v]+A[v][j];
	    Back[j]=v; } }
 for (i=1;i<=N;i++) VIZ[i]=0;
 VIZ[B]=1;
 int cnt=0,mid,d[2];
 for (i=B;Back[i]&&!VIZ[Back[i]];i=Back[i]) {
    reb[++cnt][0]=Back[i];
    reb[cnt][1]=i; }
 mid=cnt;
  VIZ[C]=1;
 for (i=C;Back[i]&&!VIZ[Back[i]];i=Back[i]) {
    reb[++cnt][0]=Back[i];
    reb[cnt][1]=i; }
 for (i=1;i<=mid/2;i++) {
    d[0]=reb[i][0];d[1]=reb[i][1];
    reb[i][0]=reb[mid-i+1][0];reb[i][1]=reb[mid-i+1][1];
    reb[mid-i+1][0]=d[0];reb[mid-i+1][1]=d[1]; }
 for (i=mid+1;i<=(cnt+mid)/2;i++) {
    d[0]=reb[i][0];d[1]=reb[i][1];
    reb[i][0]=reb[cnt+mid-i+1][0];reb[i][1]=reb[cnt+mid-i+1][1];
    reb[cnt+mid-i+1][0]=d[0];reb[cnt+mid-i+1][1]=d[1]; }
 int mid1=0;
 int flag=1;
 for (i=1;i<cnt;i++)
    for (j=i+1;j<=cnt;j++)
       if (reb[i][0]==reb[j][0]) {
	   if (A[reb[i][0]][reb[i][1]]>A[reb[j][0]][reb[j][1]]) {
	       mid1=j;
	       flag=1; }
	      else {
	       mid1=i;
	       flag=2; } }
 long Res=0;
 for (i=1;i<=cnt;i++)
    if (i!=mid1) Res+=A[reb[i][0]][reb[i][1]];
 printf("%d %d\n",cnt-1,Res);
 if (flag==1) {
     for (i=1;i<=cnt;i++)
	if (i!=mid1)
	   printf("%d %d\n",reb[i][0],A[reb[i][0]][reb[i][1]]); }
   else {
     for (i=mid+1;i<=cnt;i++)
       if (i!=mid1)
	   printf("%d %d\n",reb[i][0],A[reb[i][0]][reb[i][1]]);
     for (i=1;i<=mid;i++)
       if (i!=mid1)
	   printf("%d %d\n",reb[i][0],A[reb[i][0]][reb[i][1]]); }
 return 0;
}