#include <iostream>
#include <vector>
#include <queue>
using namespace std;

int gcd(int a, int b) {
	if(a > b) swap(a, b);
	return (a == 0) ? b : gcd(b%a, a);
}

int main() {
	int N, M, Q, MOD;
	cin >> N >> M >> Q >> MOD;
	vector< vector<int> > Gr(N), W(N);
	vector<int> W_occ(MOD, 0);
	int W_1; // arbitrary weight
	for(int i = 0; i < M; i++) {
		int a, b, c;
		cin >> a >> b >> c;
		W_1 = c;
		Gr[--a].push_back(--b);
		Gr[b].push_back(a);
		W[a].push_back(c);
		W[b].push_back(c);
		W_occ[c]++;
	}
	vector<char> is_prime(MOD+1, 1), is_unique_mod(MOD+1, 0);
	vector<int> one_prime(MOD+1, 1);
	is_unique_mod[1] = 1;
	for(int i = 2; i <= MOD; i++) if(is_prime[i])
		for(int j = i; j <= MOD; j += i) one_prime[j] = i, is_prime[j] = 0;
	for(int i = 2; i <= MOD; i++) if(is_unique_mod[i/one_prime[i]]) {
		int um = W_1 % i, occ = 0;
		for(int k = um; k < MOD; k += i) occ += W_occ[k];
		if(occ == M) is_unique_mod[i] = 1;
	}
	int G = MOD;
	while(is_unique_mod[G] == 0) G--;

	MOD = gcd(3*G, MOD);
	G = gcd(G, MOD);
	for(int i = 0; i < N; i++) for(auto & w : W[i]) w = (w % MOD - w % G) / G;
	vector<char> has_dif[2] = {vector<char>(N, 0), vector<char>(N, 0)};
	has_dif[0][0] = 1;
	queue<int> qu;
	qu.push(0);
	while(!qu.empty()) {
		int k = qu.front() % 2, v = qu.front()/6;
		for(int i = 0; i < (int)Gr[v].size(); i++) {
			int x = (qu.front()/2 + (4-2*k) * W[v][i]) % 3;
			if(((has_dif[1-k][Gr[v][i]] >> x) & 1) == 0) {
				has_dif[1-k][Gr[v][i]] |= 1<<x;
				qu.push(Gr[v][i] * 6 + x * 2 + 1-k);
			}
		}
		qu.pop();
	}
	vector<char> R[2] = {vector<char>(MOD, 0), vector<char>(MOD, 0)};
	for(int i = 0, pw = 1; i < MOD; i++, pw = 2*pw%MOD) {
		if(i%2 == 0) R[0][1LL*W_1%G*(pw+MOD-1)%MOD] = 1;
		else R[1][1LL*W_1%G*(pw+MOD-1)%MOD] = 1;
	}

	for(int q = 0; q < Q; q++) {
		int s, t, r;
		cin >> s >> t >> r;
		s--, t--;
		bool found = false;
		for(int k = 0; k < 6; k++) if((has_dif[k%2][s]>>(k/2))&1)
			for(int l = 0; l < 6; l++) if((has_dif[l%2][t]>>(l/2))&1)
				if(R[(k+l)%2][(r + 9 * G - (k/2 - l/2) * (2*(k%2)-1) * G)%MOD]) found = true;
		cout << (found ? "YES\n" : "NO\n");
	}
}
