#include <cstdio>
using namespace std;
const char iname[] = "amenzi.in";
const char oname[] = "amenzi.out";
#define MAX_N 151
#define MAX_T 3501
#define MAX_P 8000
int G[MAX_N][MAX_N];
int A[MAX_T][MAX_N];
int R[MAX_T][MAX_N], in[MAX_T][MAX_N];
int V[MAX_P], T[MAX_P], X[MAX_P], S[MAX_P];
int solve(int t, int i, int n)
{
if (in[t][i])
return R[t][i];
if (t > 0)
R[t][i] = solve(t - 1, i, n);
for (int j = 1; j <= n; ++j) {
if ((G[i][j] > 0) && (t >= G[i][j])) {
solve(t - G[i][j], j, n);
if (R[t][i] < R[t - G[i][j]][j])
R[t][i] = R[t - G[i][j]][j];
}
}
if (R[t][i] != -1)
R[t][i] += A[t][i];
in[t][i] = 1;
return R[t][i];
}
inline void shift(int & a, int & b) {
a ^= b ^= a ^= b;
}
int main(void)
{
freopen(iname, "r", stdin);
int N, M;
int K, P;
int i, j, x, y, c, t;
for (scanf("%d %d %d %d", &N, &M, &K, &P), i = 0; i < M; ++i) {
scanf("%d %d %d", &x, &y, &c);
G[x][y] = G[y][x] = c;
if (c == 0)
for (;;);
}
for (i = 0; i < K; ++i) {
scanf("%d %d %d", &x, &t, &c);
A[t][x] += c;
}
for (i = 0; i < P; ++i)
scanf("%d %d", V + i, T + i);
for (t = 0; t < MAX_T; ++t)
for (i = 0; i <= N; ++i)
R[t][i] = -1;
R[0][1] = 0;
in[0][1] = 1;
for (i = 0; i < P; ++i)
X[i] = i;
for (i = 0; i < P; ++i) {
for (j = i + 1; j < P; ++j)
if (T[i] > T[j])
shift(V[i], V[j]), shift(T[i], T[j]), shift(X[i], X[j]);
}
for (i = 0; i < P; ++i) {
S[X[i]] = solve(T[i], V[i], N);
R[T[i]][V[i]] = -1;
}
freopen(oname, "w", stdout);
for (i = 0; i < P; ++i)
printf("%d\n", S[i]);
return 0;
}