#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int fa[300010];
int find(int x)
{
	return fa[x]==x?x:fa[x]=find(fa[x]);
}
bool merge(int x,int y)
{
	int f1=find(x);
	int f2=find(y);
	if(f1==f2)return false;
	fa[f2]=f1;
	return true;
}
int gcd(int a,int b)
{
	return b==0?a:gcd(b,a%b);
}
int n,m,k,Mod;
int U[50010],V[50010],C[50010];
bool vis[2][1000010];
int main()
{
	scanf("%d %d %d %d",&n,&m,&k,&Mod);
	for(int i=0;i<n*6;i++)
		fa[i]=i;
	int g=Mod;
	for(int i=1;i<=m;i++)
	{
		scanf("%d %d %d",&U[i],&V[i],&C[i]);
		if(i>1)g=gcd(g,abs(C[i]-C[1]));
	}
	Mod=gcd(Mod,3*g);
	int z=C[1]%g;
	for(int i=1;i<=m;i++)
	{
		int u=U[i];
		int v=V[i];
		int c=(C[i]-z)/g;
		for(int p=0;p<2;p++)
			for(int q=0;q<3;q++)
			{
				merge((u-1)*6+p*3+q,(v-1)*6+(p^1)*3+(2*q+c)%3);
				merge((v-1)*6+p*3+q,(u-1)*6+(p^1)*3+(2*q+c)%3);
			}
	}
	for(int p=0;p<2;p++)
	{
		int cur=(p+1)*z%Mod;
		while(!vis[p][cur]){
			vis[p][cur]=true;
			cur=cur*4%Mod;
		}
	}
	while(k--)
	{
		int s,t,r;
		scanf("%d %d %d",&s,&t,&r);
		bool flag=false;
		for(int p=0;p<2;p++)
			for(int q=0;q<3;q++)
				if(vis[p][(z+r-q*g%Mod+Mod)%Mod]
				&&find((t-1)*6)==find((s-1)*6+p*3+q))
					flag=true;
		if(flag)printf("YES\n");
		else printf("NO\n");
	}
	return 0;
}