#include <stdio.h>
#define MAX_N 165
#define T_MAX 3670
#define MAX_M 1600
#define max(a,b) ((a) > (b) ? (a) : (b))
int N, M, K, P, sum[T_MAX][MAX_N], A[T_MAX][MAX_N];
int G[MAX_N][MAX_M], D[MAX_N][MAX_M];
void add_edge(int u, int v, int c)
{
G[u][++G[u][0]] = v, D[u][G[u][0]] = c;
G[v][++G[v][0]] = u, D[v][G[v][0]] = c;
}
void solve(void)
{
int i, t, j, k, v, c, r;
for(i = 1; i <= N; i++)
A[0][i] = -1;
A[0][1] = sum[0][1];
for(t = 1; t <= 3500; t++)
for(i = 1; i <= N; i++)
{
r = -1;
if(A[t-1][i] != -1)
r = A[t-1][i]+sum[t][i];
for(j = 1; j <= G[i][0]; j++)
{
v = G[i][j], c = D[i][j];
if(t-c >= 0 && A[t-c][v] != -1)
r = max(r, A[t-c][v]+sum[t][i]);
}
A[t][i] = r;
}
}
void read_and_solve(void)
{
int i, a, b, c;
scanf("%d %d %d %d\n", &N, &M, &K, &P);
for(i = 1; i <= M; i++)
scanf("%d %d %d\n", &a, &b, &c), add_edge(a, b, c);
for(i = 1; i <= K; i++)
{
scanf("%d %d %d\n", &a, &b, &c);
sum[b][a] += c;
}
solve();
for(i = 1; i <= P; i++)
{
scanf("%d %d\n", &a, &b);
printf("%d\n", A[b][a]);
}
}
int main(void)
{
freopen("amenzi.in", "rt", stdin);
freopen("amenzi.out", "wt", stdout);
read_and_solve();
return 0;
}