#include #include #include #include #include #include #include #include #include #include #include using namespace std; using namespace atcoder; typedef long long ll; #define rep(i,n) for (int i = 0; i < int(n);i++) int main(){ int n,m; ll x; cin >> n >> m >> x; vector,ll>>> g(n); for (int i = 0; i < m;i++){ int u,v; ll a,b; cin >> u >> v >> a >> b; g[v-1].push_back({{u-1,a},b}); g[u-1].push_back({{v-1,a},b}); } ll ok = -1,ng = 1e18+1LL; const ll INF = 1LL << 60; while(ng-ok > 1LL){ ll mid = (ok+ng)/2; vector dist(n,INF); dist[0] = 0; priority_queue,vector>,greater>> que; que.push({0,0}); while(!que.empty()){ auto [d,x] = que.top(); que.pop(); if (d > dist[x]) continue; for (auto [a,b]:g[x]){ if (a.second +dist[x] <= dist[a.first] && b >= mid){ dist[a.first] = dist[x]+a.second; que.push({dist[a.first],a.first}); } } } //cout << mid << endl; //for (auto e:dist){ // if (e >= INF) cout << "F" << " "; // else cout << e << " "; //} //cout << endl; if (dist[n-1] <= x){ ok = mid; } else{ ng = mid; } } cout << ok << endl; return 0; }