#include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; struct Edge { ll u; ll v; ll a; ll b; }; struct Node { int id; int cnt; Node(int id = -1, int cnt = -1) { this->id = id; this->cnt = cnt; } bool operator>(const Node &n) const { return cnt < n.cnt; } }; int main() { ll N, M, X; cin >> N >> M >> X; vector G[N + 1]; for (int i = 0; i < M; ++i) { ll u, v, a, b; cin >> u >> v >> a >> b; G[u].push_back(Edge{ .u = u, .v = v, .a = a, .b = b, }); G[v].push_back(Edge{ .u = v, .v = u, .a = a, .b = b, }); } ll ok = -1; ll ng = 1000000000; while (abs(ok - ng) >= 2) { ll size = (ok + ng) / 2; bool visited[N + 1]; memset(visited, false, sizeof(visited)); queue que; queue t_que; que.push(1); t_que.push(0); bool success = false; while (not que.empty()) { int u = que.front(); ll time = t_que.front(); que.pop(); t_que.pop(); if (visited[u]) continue; visited[u] = true; if (u == N) { success = true; break; } for (Edge &e : G[u]) { if (e.b < size) continue; if (e.a + time > X) continue; que.push(e.v); t_que.push(time + e.a); } } if (success) { ok = size; } else { ng = size; } } cout << ok << endl; return 0; }