#include<bits/stdc++.h>
using namespace std;
const int N=155,M=505;
struct Edge{
int v,V,L;
};
struct Node{
double d;
int v,speed;
friend bool operator < (Node x,Node y){
return x.d>y.d;
}
};
int n,m,d;
vector<Edge> G[N];
double dis[N][M];
bool S[N][M];
int pre[N][M][2];
void print(int now,int v){
if(now!=1) print(pre[now][v][0],pre[now][v][1]);
cout<<now-1<<" ";
return ;
}
signed main(){
cin>>n>>m>>d;
int a,b,v,l;
while(m--){
cin>>a>>b>>v>>l;
G[a+1].push_back({b+1,v+1,l+1});
}
for(int i=1;i<=n;++i){
for(int j=1;j<=500;++j) dis[i][j]=2e9;
}
dis[1][70]=0;
priority_queue<Node> q;
q.push({0,1,70});
while(!q.empty()){
int x=q.top().v,y=q.top().speed;
q.pop();
if(S[x][v]) continue;
S[x][v]=1;
for(auto [v,V,L]:G[x]){
if(V==0){
if(dis[v][y]>dis[x][y]+(double)L/y){
dis[v][y]=dis[x][y]+1.0*L/y;
pre[v][y][0]=x;
pre[v][y][1]=y;
q.push({dis[v][y],v,y});
}
}
else{
if(dis[v][V]>dis[x][y]+(double)L/V){
dis[v][V]=dis[x][y]+1.0*L/V;
pre[v][V][0]=x;
pre[v][V][1]=y;
q.push({dis[v][V],v,V});
}
}
}
}
int x=0;
for(int i=1;i<=500;++i){
if(dis[d+1][i]>dis[d+1][x]) x=i;
}
print(d+1,x);
return 0;
}