#include <cstdio>
#include <cctype>
#include <iostream>
typedef long long ll;
template <typename T> T read() {
T res = 0, f = 1;
char ch = getchar();
for (; !isdigit(ch); ch = getchar()) if (ch == '-') f = -1;
for (; isdigit(ch); ch = getchar()) res = (res << 3) + (res << 1) + (ch ^ 48);
return res * f;
}
const int MAXN = 110;
int n, m, q;
ll V;
ll dis[MAXN][MAXN];
int main() {
freopen("Paths.in", "r", stdin);
freopen("Paths.out", "w", stdout);
n = read<int>(), m = read<int>(), q = read<int>(), V = read<ll>();
for (int i = 1; i <= m; ++i) {
int u = read<int>(), v = read<int>(); ll w = read<ll>();
dis[u][v] = dis[v][u] = w;
}
for (int k = 1; k <= n; ++k) {
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
if (dis[i][k] && dis[k][j]) {
if ((dis[i][k] & dis[k][j]) > dis[i][j]) {
dis[i][j] = dis[i][k] & dis[k][j];
}
}
}
}
}
while (q--) {
int u = read<int>(), v = read<int>();
puts(dis[u][v] >= V ? "Yes" : "No");
}
return 0;
}