#include using namespace std::literals::string_literals; using i64 = std::int_fast64_t; using std::cout; using std::cerr; using std::endl; using std::cin; #if defined(DONLINE_JUDGE) #define NDEBUG #elif defined(ONLINE_JUDGE) #define NDEBUG #endif template std::vector make_v(size_t a){return std::vector(a);} template auto make_v(size_t a, Ts... ts){ return std::vector(ts...))>(a, make_v(ts...)); } int main() { int n, m, x; scanf("%d%d%d", &n, &m, &x); std::vector u(m), v(m), a(m), b(m); std::vector> g(n); for (int i = 0; i < m; ++i) { scanf("%d%d%d%d", &u[i], &v[i], &a[i], &b[i]); g[--u[i]].push_back(i); g[--v[i]].push_back(i); } auto f = [&](int t) { using P = std::pair; std::priority_queue, std::greater

> qu; std::vector costs(n, 1LL << 60); qu.push({costs[0] = 0, 0}); while (!qu.empty()) { auto [cost, now] = qu.top(); qu.pop(); if (costs[now] != cost) continue; for (int idx: g[now]) { int to = u[idx] ^ v[idx] ^ now; i64 nx = a[idx] + cost; if (b[idx] < t) continue; if (costs[to] <= nx) continue; qu.push({costs[to] = nx, to}); } } return costs[n - 1] <= x; }; int ok = -1, ng = 1 << 30; while (ng - ok > 1){ int mid = (ok + ng) >> 1; if (f(mid)) ok = mid; else ng = mid; } printf("%d\n", ok); return 0; }