#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 u; ll time; Node(int u = -1, ll time = -1) { this->u = u; this->time = time;; } bool operator>(const Node &n) const { return time > n.time; } }; 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)); priority_queue , greater> pque; pque.push(Node(1, 0)); bool success = false; while (not pque.empty()) { Node node = pque.top(); pque.pop(); if (visited[node.u]) continue; visited[node.u] = true; if (node.u == N) { success = true; break; } for (Edge &e : G[node.u]) { if (e.b < size) continue; if (e.a + node.time > X) continue; pque.push(Node(e.v, node.time + e.a)); } } if (success) { ok = size; } else { ng = size; } } cout << ok << endl; return 0; }