#include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<vector> #include<algorithm> using namespace std; typedef __int64 ss; struct node { ss k; ss t; ss v; }; ss n,m,t,a[50005],sum,flag; vector<node>vet[10005]; ss vist[10005],dis[10005]; ss spfa(ss num) { ss minx=a[num]; for(ss i=0; i<=n; i++) { dis[i]=((ss)1<<25); vist[i]=0; } dis[1]=0; vist[1]=1; queue<ss>q; q.push(1); while(!q.empty()) { ss x=q.front(); q.pop(); vist[x]=0; for(ss i=0; i<vet[x].size(); i++) { node p=vet[x][i]; if(p.v>=minx) { if(dis[p.k]>dis[x]+p.t) { dis[p.k]=dis[x]+p.t; if(!vist[p.k]) q.push(p.k); vist[p.k]=1; } } } } if(dis[n]<=t) return 1; else return 0; } int main() { int text; scanf("%d",&text); while(text--) { ss cnt=0; scanf("%I64d%I64d%I64d",&n,&m,&t); for(ss i=0; i<=n; i++) vet[i].clear(); for(ss i=0; i<m; i++) { ss v1,v2,tmp,tmp1; scanf("%I64d %I64d %I64d %I64d",&v1,&v2,&tmp,&tmp1); node p; p.k=v2; p.t=tmp1; p.v=tmp; vet[v1].push_back(p); p.k=v1; vet[v2].push_back(p); a[cnt++]=tmp; } sort(a,a+cnt); ss ll=0,rr=cnt-1; ss ans=0; while(ll<=rr) { ss mid=(ll+rr)/2; if(spfa(mid)) { if(ans<a[mid]) ans=a[mid]; ll=mid+1; } else rr=mid-1; } printf("%I64d\n",ans); } return 0; }