#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;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgbGxkIGxvbmcgZG91YmxlCiNkZWZpbmUgaWludCBpbnQKI2RlZmluZSBpbnQgbG9uZyBsb25nCiNkZWZpbmUgbG9nQXJyKGFycikgZm9yKGF1dG8gaTphcnIpIGNvdXQ8PGk8PCcgJzsKI2RlZmluZSBsb2dBcnIyRChhcnIpIGZvciAoYXV0byBpOmFycikge2ZvcihhdXRvIGo6aSljb3V0PDxqPDwnICc7Y291dDw8ZW5kbDt9CiNkZWZpbmUgcmVhZEFycihhcnIpIGZvcihhdXRvICZpIDogYXJyKSBjaW4+Pmk7CiNkZWZpbmUgYWxsQXJyKGFycikgYXJyLmJlZ2luKCksIGFyci5lbmQoKQovLyNkZWZpbmUgT05MSU5FX0pVREdFIHRydWU7CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CmludCBuLCBleGNoLCBtbiwgcmVjZWl2ZWQ7CmNvbnN0IGxvbmcgbG9uZyBJTkYgPSAyZTE4OwogCmxvbmcgbG9uZyBkZnMoaW50IHUsIHZlY3RvcjxzZXQ8cGFpcjxpbnQsIGludD4+PiYgcmV2ZXJzZV9hZGosIHZlY3RvcjxpbnQ+JiBzdGF0ZSwgdmVjdG9yPGludD4mIGRwKSB7CiAgIGlmIChzdGF0ZVt1XSA9PSAxKSByZXR1cm4gSU5GOwogCiAgIGlmIChzdGF0ZVt1XSA9PSAyKSByZXR1cm4gZHBbdV07CiAKICAgc3RhdGVbdV0gPSAxOwogICBsb25nIGxvbmcgbWF4X2VmZm9ydCA9IDA7CiAKICAgZm9yIChhdXRvJiBlZGdlIDogcmV2ZXJzZV9hZGpbdV0pIHsKICAgICAgaW50IHYgPSBlZGdlLmZpcnN0OwogICAgICBsb25nIGxvbmcgd2VpZ2h0ID0gZWRnZS5zZWNvbmQ7CiAKICAgICAgbG9uZyBsb25nIGVmZm9ydCA9IGRmcyh2LCByZXZlcnNlX2Fkaiwgc3RhdGUsIGRwKTsKIAogICAgICBpZiAoZWZmb3J0ID09IElORikgewogICAgICAgICBtYXhfZWZmb3J0ID0gSU5GOwogICAgICAgICBicmVhazsKICAgICAgfQogICAgICBtYXhfZWZmb3J0ID0gbWF4KG1heF9lZmZvcnQsIGVmZm9ydCArIHdlaWdodCk7CiAgIH0KIAogICBzdGF0ZVt1XSA9IDI7CiAgIGRwW3VdID0gbWF4X2VmZm9ydDsKICAgcmV0dXJuIG1heF9lZmZvcnQ7Cn0Kdm9pZCBzb2x2ZSgpewogICBjaW4+Pm4+PmV4Y2g+Pm1uPj5yZWNlaXZlZDsKICAgdmVjdG9yPHNldDxwYWlyPGludCwgaW50Pj4+IGdmKG4rMSk7CiAgIHZlY3RvcjxpbnQ+IHZpcyhuKzEpLCBkcChuKzEpOwogICB2ZWN0b3I8aW50PiBteGNvc3QobisxKTsKIAogICB3aGlsZShleGNoLS0pewogICAgICBpbnQgdSwgdiwgYzsgY2luPj51Pj52Pj5jOwogICAgICBnZlt2XS5pbnNlcnQoe3UsIGN9KTsKICAgfQogICBpbnQgcmVzID0gZGZzKHJlY2VpdmVkLCBnZiwgdmlzLCBkcCk7CiAgIGlmKHJlcz49bW4pCiAgICAgIGNvdXQ8PCJZRVMiPDxlbmRsOwogICBlbHNlCiAgICAgIGNvdXQ8PCJOTyI8PGVuZGw7Cn0KIApzaWduZWQgbWFpbigpIHsKICAgaW9zOjpzeW5jX3dpdGhfc3RkaW8oMCk7Y2luLnRpZSgwKTsKI2lmbmRlZiBPTkxJTkVfSlVER0UKICAgZnJlb3BlbigiaW5wdXQudHh0IiwgInIiLCBzdGRpbik7CiAgIGZyZW9wZW4oIm91dHB1dC50eHQiLCAidyIsIHN0ZG91dCk7CiNlbmRpZgogICBpbnQgdD0xOwogICBjaW4+PnQ7CiAgIHdoaWxlKHQtLSkKICAgICAgc29sdmUoKTsKIAogICByZXR1cm4gMDsKfQ==