#include #include #include using namespace std; struct edge{ int to, a, b; }; int main(){ int n,m; long long x; cin>>n>>m>>x; vector> G(n); for(int i=0;i>u>>v>>a>>b; --u,--v; G[u].push_back({v,a,b}); G[v].push_back({u,a,b}); } long long l=-1,r=1e9+5; priority_queue, vector>, greater>> que; while(r-l>1){ long long m=(l+r)/2; vector dist(n, 1e18+5); dist[0]=0; que.push({0,0}); while(!que.empty()){ auto [d,v]=que.top(); que.pop(); if(dist[v]!=d)continue; for(const auto&[to, a, b]:G[v]){ if(bd+a){ dist[to]=d+a; que.push({d+a,to}); } } } if(dist[n-1]<=x){ l=m; }else{ r=m; } } cout<