#include <bits/stdc++.h>
using namespace std;
const int N = 505;
int n, m, d;
struct node
{
int v, next;
int s, len;
};
struct Queue
{
int v;
double dis;
int t;
bool operator<(const Queue &x) const
{
return dis > x.dis;
}
};
node e[N];
priority_queue<Queue> q;
double dis[N][N];
pair<int, int> ans[N][N];
int vis[N][N], head[N], cnt;
void add(int a, int b, int c, int d)
{
e[++cnt] = {b, head[a], c, d};
head[a] = cnt;
}
void print(int d, int x)
{
if (d == 1)
return;
print(ans[d][x].first, ans[d][x].second);
printf("%d ", d - 1);
}
void dijkstra()
{
memset(dis, 0x3f, sizeof dis);
dis[1][70] = 0;
q.push({0, 70, 1});
while (!q.empty())
{
int u = q.top().v, S = q.top().dis;
q.pop();
if (vis[u][S])
continue;
vis[u][S] = 1;
for (int i = head[u]; ~i; i = e[i].next)
{
int speed = S;
if (e[i].s)
speed = e[i].s;
if (dis[e[i].v][speed] > dis[u][S] + e[i].len * 1.0 / speed)
{
dis[e[i].v][speed] = dis[u][S] + e[i].len * 1.0 / speed;
ans[e[i].v][speed] = make_pair(u, S);
q.push({e[i].v, dis[e[i].v][speed], speed});
}
}
}
return;
}
int main()
{
memset(head, -1, sizeof head);
cin >> n >> m >> d;
for (int i = 1; i <= m; i++)
{
int a, b, l, s;
cin >> a >> b >> s >> l;
add(a + 1, b + 1, s, l);
}
dijkstra();
int ans = 0;
dis[++d][ans] = 0x3f3f3f3f;
for (int i = 1; i <= 1000; i++)
{
if (dis[d][i] < dis[d][ans])
ans = i;
}
print(d, ans);
return 0;
}