#include <stdio.h>
#include <string.h>
#define fin "amenzi.in"
#define fout "amenzi.out"
#define TMAX 3501
#define NMAX 151
FILE * f;
int a[NMAX][NMAX],s[TMAX][NMAX],N,M,K,P;
void readData()
{
f = fopen(fin,"r");
fscanf(f,"%d %d %d %d",&N,&M,&K,&P); fprintf(stderr,"%d",P);
for(int i = 0 ,x,y,c ;i<M;++i)
{
fscanf(f,"%d %d %d",&x,&y,&c);
a[x][y] = a[y][x] = c;
}
for(int i = 0 ,x,y,c;i<K;++i)
{
fscanf(f,"%d %d %d",&x,&y,&c);
s[y][x] = c;
}
}
void init()
{
memset(s,-1,sizeof s);
}
void query()
{
FILE * g = fopen(fout,"w");
for(int i = 0,x,y; i < P ; ++i)
{
fscanf(f,"%d %d",&x,&y);
fprintf(g,"%d\n",s[y][x]);
}
fclose(f);
fclose(g);
}
void calc()
{
int max;
s[0][1] = 0;
for ( int i = 1 ; i<TMAX ; ++i)
for ( int j = 1;j<=N; ++j)
{
max = s[i-1][j];
for(int k = 1 ; k <=N ; ++k)
if(k!=j & a[k][j]>0 & i-a[k][j]>=0 & s[ i - a[k][j] ][ k ]!=-1)
if(s[ i-a[k][j] ][ k ] > max)
max = s[ i - a[k][j] ][ k ];
if(s[i][j]!=-1 & max!=-1) s[i][j] += max;
else s[i][j] = max;
}
}
void afis()
{
FILE * g = fopen(fout,"w");
for(int i=0;i<TMAX;++i) {
for(int j=1;j<=N;++j)
fprintf(g,"%d ",s[i][j]);
fprintf(g,"\n");
}
}
int main()
{
init();
readData();
calc();
query();
return 0;
}