#include <stdio.h>

#define MAXD 10000000000000.0
#define BASV 70
#define MAXN 501

int a,b,c,e,ant, s,f;
int ed[MAXN][MAXN], v[MAXN][MAXN], w[MAXN][MAXN], ae[MAXN];
double d[MAXN*MAXN], min;
int tagen[MAXN];
int nn, nv, npos, ok, bras;
int bra[200], list[200];

void MLX(int nr, int step, double dist) {
   int q, cn, cv;
   cn = nr % ant;
   cv = nr / ant;
   if(tagen[cn] || dist > d[nr]) return;
   d[nr] = dist;
   list[step] = cn;
   if(cn == f) {
      ok = 1;
      if(dist < min) {
      	min = dist;
         bras = step;
         for(a=0;a<=step;a++) bra[a] = list[a];
      }
      return;
	}
   tagen[cn] = 1;
   for(q=0;q<ae[cn];q++) {
      nn = ed[cn][q];
      nv = v[cn][q]==0?cv:v[cn][q];
      MLX(nv * ant + nn, step + 1, dist + (double)w[cn][q] / (double)nv);
	}
   tagen[cn] = 0;
}

int main() {
	scanf("%d %d %d", &ant, &b, &f);
   s = 0;
   for(a=0;a<ant;a++) ae[a] = 0;
	for(a=0;a<b;a++) {
   	scanf("%d %d", &c, &e);
      ed[c][ae[c]] = e;
      scanf("%d %d", &v[c][ae[c]], &w[c][ae[c]]);
      ae[c]++;
   }

   for(a=0;a<ant*MAXN;a++) d[a] = MAXD;
	for(a=0;a<ant;a++) tagen[a] = 0;
   ok = 0;
   min = MAXD;
   MLX(BASV * ant + s, 0, 0.0);
	if(!ok) printf("Impossible to reach destination.\n");
   else {
      for(a=0; a<=bras;a++) printf("%d ", bra[a]);
      printf("\n");
   }
   return 0;
}

