#include<bits/stdc++.h>
using namespace std;
#define int long long
#define inf 0x3f3f3f3f
#define N 500010
#define pii pair<int,int>
int n, m, q, v;
int qwq[100];
int t;
struct Edge {
int x, y, v;
} edge[N];
int fa[62][N];
int getfa(int x, int sb) {
if(fa[sb][x] == x)return x;
else return fa[sb][x] = getfa(fa[sb][x], sb);
}
void merge(int x, int y, int sb) {
x = getfa(x, sb);
y = getfa(y, sb);
fa[sb][x] = y;
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> m >> q >> v;
for(int i = 1; i <= m; i++) {
int x, y, vv;
cin >> x >> y >> vv;
edge[i] = {x, y, vv};
}
int tmp = v;
while(tmp) {
qwq[t] = (tmp & 1);
t++;
tmp >>= 1;
}
for(int i=t;i>=0;i--)cout<<qwq[i];
cout<<'\n';
for(int i = 1; i <= t; i++) {
for(int j = 1; j <= n; j++) {
fa[i][j] = j;
}
}
for(int i = 1; i <= m; i++) {
for(int j = 1; j<=t; j++) {
bool flag = edge[i].v >> (t - j) & 1;
if((!qwq[j]) && flag) merge(edge[i].x, edge[i].y, j);
else if(qwq[j] && !flag) break;
}
if((edge[i].v & v) >= v) merge(edge[i].x, edge[i].y, 61);
}
for(int i = 1; i <= q; i++) {
int x, y;
cin >> x >> y;
bool flag = false;
for(int j = 1; j <= 61; j++) {
if(getfa(x, j) == getfa(y, j)) {
flag = true;
break;
}
}
if(flag) cout << "Yes\n";
else cout << "No\n";
}
return 0;
}