#include<stdio.h>
#include<string.h>
#include<vector>
#define TMAX 3502
#define NMAX 256
using namespace std;
int N,M,K,P;
int F[NMAX][TMAX],ANS[NMAX][TMAX];
vector< pair< int,int > > G[NMAX];
inline int max(const int a,const int b)
{
return a>b?a:b;
}
inline int min(const int a,const int b)
{
return a<b?a:b;
}
void read()
{
scanf("%d%d%d%d\n",&N,&M,&K,&P);
int i,j,k,a1,a2,a3;
for(i=1; i<=M; ++i)
{
scanf("%d%d%d\n",&a1,&a2,&a3);
G[a1].push_back(make_pair(a2,a3));
G[a2].push_back(make_pair(a1,a3));
}
for(i=1; i<=K; ++i)
{
scanf("%d%d%d\n",&a1,&a2,&a3);//intersectia a1, timpul a2, amenda a3
F[a1][a2]+=a3;
}
}
void poirot()
{
int i,j,a1;
memset(ANS,0xff,sizeof(ANS));
ANS[1][0]=0;
vector< pair<int,int> >::iterator it;
for(i=0; i<=3500; ++i)
{
for(j=1; j<=N; ++j)
{
if( ANS[j][i]!=-1 )
{
ANS[j][i]+=F[j][i];
ANS[j][i+1]=max(ANS[j][i+1],ANS[j][i]);//stai pe loc
for(it=G[j].begin(); it!=G[j].end(); ++it)
{
a1=i+it->second;
if( a1<=3500 )
ANS[it->first][a1]=max(ANS[it->first][a1],ANS[j][i]);
}
}
}
}
}
void show()
{
int i,a1,a2;
for(i=1; i<=P; ++i)
{
scanf("%d%d\n",&a1,&a2);
a2=min(TMAX,a2);
printf("%d\n",ANS[a1][a2]);
}
}
int main()
{
freopen("amenzi.in","r",stdin);
freopen("amenzi.out","w",stdout);
read();
poirot();
//
show();
return 0;
}