/*
TASK: wireless
LANG: C
*/

#include <stdio.h>

#define MAX 1024

#define INF 2000000000

int n;
int t[MAX][MAX];
int dist[MAX];
int par[MAX];
int used[MAX];
int stack[MAX];
int pl,pe;
int path[MAX];

void dijkstra (int start,int final) {
int i;
int bnode,best;
     for (i=1;i<=n;i++) {
         dist[i] = INF;
         used[i] = 0;
     }
     dist[start] = 0;
     par[start] = 0;
     while (1) {
           bnode = -1;
           best  = INF;
           for (i=1;i<=n;i++)
               if (!used[i] && dist[i]<best) {
                  best = dist[i];
                  bnode = i;
               }
           if (bnode==-1) return;
           if (bnode==final) return;
           used[bnode] = 1;
           for (i=1;i<=n;i++)
               if (t[bnode][i])
                  if (t[bnode][i]+dist[bnode]<dist[i]) {
                     dist[i] = dist[bnode]+t[bnode][i];
                     par[i] = bnode;
                  }
     }
     
}

void build_path(int start,int final) {
int st = 2;
int x,i,j;
     stack[1] = final;
     x = final;
     while (x!=start) {
           stack[st++] = par[x];
           x = par[x];
     }
     st--;
     for (i=st,j=1;i>0;i--,j++)
         path[j] = stack[i];
     pe = 0;
     pl = st;
     for (i=1;i<st;i++) {
         pe+=t[path[i]][path[i+1]];
     }
}

int main () {
int i,j,a,b,c,nasl,to,cost;
//    freopen ("wireless.in" , "r" , stdin);
    scanf("%d%d%d%d",&n,&a,&b,&c);
    for (i=1;i<=n;i++) {
        scanf("%d",&nasl);
        for (j=0;j<nasl;j++) {
            scanf("%d%d",&to,&cost);
            t[i][to] = cost;
        }
    }
    dijkstra(a,c);
    build_path(a,c);
    for (i=1;i<=pl;i++)
        if (path[i]==b) {
           printf("%d %d\n",pl-1,pe);
           for (j=1;j<pl;j++)
               printf("%d %d\n",path[j],t[path[j]][path[j+1]]);
           return 0;
        }
    
    dijkstra(a,b);
    build_path(a,b);
    for (i=1;i<=pl;i++)
        if (path[i]==c) {
           printf("%d %d\n",pl-1,pe);
           for (j=1;j<pl;j++)
               printf("%d %d\n",path[j],t[path[j]][path[j+1]]);
           return 0;
        }
        
    return 0;
}
