#include <stdio.h>
#define NIL -1
#define MAXN 150
#define MAXT 3500
#define MAXM 1500
int k, d[MAXT+1][MAXN+1], infr[MAXT+1][MAXN+1], next[2*MAXM+1], cost[2*MAXM+1], val[2*MAXM+1], lista[MAXN+1];
inline void adauga(int a, int b, int c){
k++;
cost[k]=c;
val[k]=b;
next[k]=lista[a];
lista[a]=k;
}
int main(){
int a, b, c, n, m, p, q, i, j;
FILE *fin, *fout;
fin=fopen("amenzi.in", "r");
fout=fopen("amenzi.out", "w");
fscanf(fin, "%d%d%d%d", &n, &m, &p, &q);
k=0;
for(i=0; i<m; i++){
fscanf(fin, "%d%d%d", &a, &b, &c);
adauga(a, b, c);
adauga(b, a, c);
}
for(i=0; i<p; i++){
fscanf(fin, "%d%d%d", &a, &b, &c);
infr[b][a]+=c;
}
for(i=2; i<=n; i++){
d[0][i]=NIL;
}
d[0][1]=infr[0][1];
for(i=1; i<=MAXT; i++){
for(j=1; j<=n; j++){
if(d[i-1][j]==NIL){
d[i][j]=NIL;
}else{
d[i][j]=d[i-1][j]+infr[i][j];
}
p=lista[j];
while(p!=0){
if((i>=cost[p])&&(d[i-cost[p]][val[p]]!=NIL)&&(d[i][j]<d[i-cost[p]][val[p]]+infr[i][j])){
d[i][j]=d[i-cost[p]][val[p]]+infr[i][j];
}
p=next[p];
}
}
}
for(i=0; i<q; i++){
fscanf(fin, "%d%d", &a, &b);
fprintf(fout, "%d\n", d[b][a]);
}
fclose(fin);
fclose(fout);
return 0;
}