#include <bits/stdc++.h>
#define lld long double
#define iint int
#define int long long
#define logArr(arr) for(auto i:arr) cout<<i<<' ';
#define logArr2D(arr) for (auto i:arr) {for(auto j:i)cout<<j<<' ';cout<<endl;}
#define readArr(arr) for(auto &i : arr) cin>>i;
#define allArr(arr) arr.begin(), arr.end()
//#define ONLINE_JUDGE true;
using namespace std;
int n, exch, mn, received;
const long long INF = 2e18;
 
long long dfs(int u, vector<set<pair<int, int>>>& reverse_adj, vector<int>& state, vector<int>& dp) {
   if (state[u] == 1) return INF;
 
   if (state[u] == 2) return dp[u];
 
   state[u] = 1;
   long long max_effort = 0;
 
   for (auto& edge : reverse_adj[u]) {
      int v = edge.first;
      long long weight = edge.second;
 
      long long effort = dfs(v, reverse_adj, state, dp);
 
      if (effort == INF) {
         max_effort = INF;
         break;
      }
      max_effort = max(max_effort, effort + weight);
   }
 
   state[u] = 2;
   dp[u] = max_effort;
   return max_effort;
}
void solve(){
   cin>>n>>exch>>mn>>received;
   vector<set<pair<int, int>>> gf(n+1);
   vector<int> vis(n+1), dp(n+1);
   vector<int> mxcost(n+1);
 
   while(exch--){
      int u, v, c; cin>>u>>v>>c;
      gf[v].insert({u, c});
   }
   int res = dfs(received, gf, vis, dp);
   if(res>=mn)
      cout<<"YES"<<endl;
   else
      cout<<"NO"<<endl;
}
 
signed main() {
   ios::sync_with_stdio(0);cin.tie(0);
#ifndef ONLINE_JUDGE
   freopen("input.txt", "r", stdin);
   freopen("output.txt", "w", stdout);
#endif
   int t=1;
   cin>>t;
   while(t--)
      solve();
 
   return 0;
}