/*
TASK:wireless
LANG:C
*/

#include <stdio.h>
#include <limits.h>

#define MAXN 2310

int matrix[MAXN][MAXN];
short path[MAXN][MAXN];
short used[MAXN];
int n;
int a,b,c;
int calc(int i,int j)
{
 if(path[i][j])
    return calc(i,path[i][j])+calc(path[i][j],j);
 else if(i!=j && (used[i]!=1))
 {
    used[i]=1;
    return 1;
 }
 else
     return 0;

}
int fe(int i,int j)
{
 if(i==j)
         return 0;
 if(path[i][j])
    return fe(i,path[i][j]);
 else
     return matrix[i][j];
}
void print(int i,int j)
{
 if(path[i][j])
 {
    print(i,path[i][j]);
    print(path[i][j],j);
 }
 else if(i!=j && (used[i]!=2))
 {
   printf("%d %d\n",i,matrix[i][j]);
   used[i]=2;
 }
}
void floyd()
{
 int i,j,k;
 for(k=1;k<=n;k++)
    for(i=1;i<=n;i++)
       for(j=1;j<=n;j++)
          if(i!=j)
             if((matrix[i][k]+matrix[k][j])<matrix[i][j])
             {
              matrix[i][j]=matrix[i][k]+matrix[k][j];
              path[i][j]=k;
             }
}
int cm(int k)
{
 int u,v;
 u=fe(k,b);
 v=fe(k,c);
 if(u<v)
        v=u;
 
 return matrix[a][k]+matrix[k][b]+matrix[k][c]-v;
}
int main()
{
 int i,j,k,q,p;
// freopen("wireless.in","r",stdin);
 scanf("%i %i %i %i",&n,&a,&b,&c);
 for(i=1;i<MAXN;i++)
    for(j=1;j<MAXN;j++)
    {
       matrix[i][j]=INT_MAX/3;
       path[i][j]=0;
       if(i==j)
               matrix[i][j]=0;
    }
 for(i=1;i<=n;i++)
 {
  scanf("%i",&k);
  for(j=0;j<k;j++)
  {
   scanf("%i %i",&q,&p);
   matrix[i][q]=p;
  }
 }
 floyd();
 p=1,q=INT_MAX;
 for(i=2;i<=n;i++)
    if((j=cm(i))<q)
    {
       p=i;
       q=j;
    }

 printf("%d %d\n",calc(a,p)+calc(p,b)+calc(p,c),q);
 print(a,p);
 print(p,b);
 print(p,c);
 return 0;
}
