#include <bits/stdc++.h>
using namespace std;
int n,m,q,mod,fa[600010],id[50010][3][2],x=0,g=0,z;
bool can_a[2][1000010];
struct edge{
	int u,v,w;
}e[50010];
int find(int a){
	return fa[a]==a?a:fa[a]=find(fa[a]);
}
int gcd(int x,int y){
	return y?gcd(y,x%y):x;
}
void merge(int u,int v){
	int fau=find(u),fav=find(v);
	if(fau==fav) return;
	fa[fav]=fau;
}
int main() {
	scanf("%d %d %d %d",&n,&m,&q,&mod);
	for(int i=1;i<=n;i++) for(int j=0;j<3;j++) for(int k=0;k<2;k++) id[i][j][k]=++x,fa[x]=x;
	for(int i=1;i<=m;i++) scanf("%d %d %d",&e[i].u,&e[i].v,&e[i].w),g=gcd(abs(e[i].w-e[1].w),g);
	if(!g) g=mod;
	mod=gcd(mod,3*g),z=e[1].w%g;
	for(int i=1;i<=m;i++){
		for(int j=0;j<3;j++) for(int k=0;k<2;k++){
			merge(id[e[i].u][j][k],id[e[i].v][(2*j+e[i].w/g)%3][k^1]);
			merge(id[e[i].v][j][k],id[e[i].u][(2*j+e[i].w/g)%3][k^1]);
		}
	}
	for(int i=0,j=z,ed=mod*2;i<ed;i++,j=2*j%mod) can_a[i&1][j]=1;
	for(int i=1,s,t,r;i<=q;i++){
		scanf("%d %d %d",&s,&t,&r);
		bool flag=false;
		for(int j=0;j<3;j++) for(int k=0;k<2;k++) if(find(id[t][0][0])==find(id[s][j][k])) flag|=can_a[k][(r+z+(3-j)*g)%mod];
		puts(flag?"YES":"NO");
	}
	return 0;
}