#include<bits/stdc++.h>
#define int long long
#define fi first
#define se second
#define mp make_pair
using namespace std;
ifstream fin("Paths.in");
ofstream fout("Paths.out");
auto mread = [](){
int x;
fin >> x;
return x;
};
const int N = 5e5 + 5;
int n = mread(), m = mread(), q = mread(), v = mread();
struct node{
int u, v, w;
}s[N];
struct Node{
int u, v, ans;
}a[N];
int fa[N];
int findfa(int x){
if(fa[x] == x)
return x;
return fa[x] = findfa(fa[x]);
}
void add(int x, int y){
int a = findfa(x), b = findfa(y);
if(a != b){
fa[a] = b;
}
return;
}
void check(int x){
// cout << (bitset<62>)x << "\n";
for(int i = 1; i <= n; i ++)
fa[i] = i;
for(int i = 1; i <= m; i ++){
if((s[i].w | x) == s[i].w){
add(s[i].u, s[i].v);
}
}
for(int i = 1; i <= q; i ++){
if(findfa(a[i].u) == findfa(a[i].v)){
a[i].ans = 1;
}
}
}
signed main(){
for(int i = 1; i <= m; i ++){
s[i].u = mread();
s[i].v = mread();
s[i].w = mread();
}
for(int i = 1; i <= q; i ++){
a[i].u = mread(), a[i].v = mread();
}
for(int i = 0; i <= 61; i ++){
if((v >> i) & 1){
check(v);
}
else{
int x = v;
x |= (1ll << i);
x &= ~((1ll << i) - 1);
check(x);
}
}
for(int i = 1; i <= q; i ++){
if(a[i].ans){
fout << "Yes\n";
}
else{
fout << "No\n";
}
}
}