#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define N 1000010
using namespace std;
int fa[N];
int get(int x,int y,int z){return (x-1)*6+y*3+z;}
int find(int x){return fa[x]==x?fa[x]:(fa[x]=find(fa[x]));}
int u[N],v[N],w[N];
bool can[2][N];
int gcd(int a,int b){return b==0?a:gcd(b,a%b);}
int main()
{
	int n,m,t,mod;
	scanf("%d%d%d%d",&n,&m,&t,&mod);
	int g=0;
	for(int i=1;i<=m;i++) scanf("%d%d%d",&u[i],&v[i],&w[i]);
	for(int i=2;i<=m;i++) g=gcd(g,abs(w[i]-w[1]));
	if(!g) g=mod;
	mod=gcd(mod,g*3);
	for(int i=0;i<=6*n;i++) fa[i]=i;
	for(int i=1;i<=m;i++)
	{
		int l=(w[i]-w[1]%g)/g,x,y;
		for(int p=0;p<=1;p++)
			for(int q=0;q<=2;q++)
			{
				int nq=(2*q+l)%3;
				x=get(u[i],p,q);
				y=get(v[i],1-p,nq);
				fa[find(x)]=find(y);
				x=get(v[i],p,q);
				y=get(u[i],1-p,nq);
				fa[find(x)]=find(y);
			}
	}
	for(int i=0,j=w[1]%g;i<mod*2;i++,j=j*2%mod) can[i&1][j]=true;
	while(t--)
	{
		int s,t,l;
		scanf("%d%d%d",&s,&t,&l);
		bool ans=0;
		for(int p=0;p<=1 && !ans;p++)
			for(int q=0;q<=2 && !ans;q++)
			if(find(get(s,p,q))==find(get(t,0,0))) ans=can[p][(l+w[1]%g+(3-q)*g)%mod];
		puts(ans?"YES":"NO");
	}
	return 0;
}
