#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <vector>
using namespace std;
#define FOR(i, a, b) for (i = (a); i <= (b); i ++)
#define REP(i, n) for (i = 0; i < (n); i ++)
#define MP make_pair
#define PB push_back
#define TMAX 3505
#define NMAX 155
int N, M, K, P, i, j, k, stp;
int a[TMAX][NMAX], m[TMAX][NMAX];
vector<pair<int, int> > adj[NMAX];
int main(void)
{
freopen("amenzi.in", "r", stdin);
freopen("amenzi.out", "w", stdout);
scanf("%d %d %d %d", &N, &M, &K, &P);
REP(stp, M)
{
scanf("%d %d %d", &i, &j, &k);
adj[i].PB(MP(j, k)), adj[j].PB(MP(i, k));
}
memset(a, 0, sizeof(a));
REP(stp, K)
{
scanf("%d %d %d", &i, &j, &k);
a[j][i] += k;
}
memset(m, 0xFF, sizeof(m));
m[0][1] = a[0][1];
FOR(i, 1, 3500)
FOR(j, 1, N)
{
if (m[i - 1][j] != -1) m[i][j] = m[i - 1][j] + a[i][j];
for (vector<pair<int, int> > :: iterator it = adj[j].begin(); it != adj[j].end(); it ++)
if (i - it->second >= 0 && m[i - it->second][it->first] != -1 && m[i - it->second][it->first] + a[i][j] > m[i][j])
m[i][j] = m[i - it->second][it->first] + a[i][j];
}
REP(stp, P)
{
scanf("%d %d", &i, &j);
printf("%d\n", m[j][i]);
}
return 0;
}