#include<stdio.h>
#include<vector>
#define Nmax 155
#define Tmax 3505
#define max(a,b) a>b?a:b
using namespace std;
vector< pair<int,int> > v[ Nmax ];
int x[ Nmax ][ Tmax ],cost[ Nmax ][ Tmax ],i,j,k,l,m,n,p;
bool viz[ Nmax ][ Tmax ];
void citire(){
freopen("amenzi.in","r",stdin);
scanf("%d %d %d %d",&n,&m,&k,&p);
int i,a,b,c;
for(i = 1 ;i <= m ; i++)
{scanf("%d %d %d",&a,&b,&c);
v[a].push_back(make_pair(b,c));
v[b].push_back(make_pair(a,c));
}
for(i = 1; i<= k ; i++)
{scanf("%d %d %d",&a,&b,&c);
cost[ a ][ b ] += c;
}
}
int supremum(int nod,int T,bool &ok){
int i,N,sol = 0,X,t;
N = v[ nod].size();
for(i = 0 ; i< N;i++)
{X = v[nod][i].first;
t = v[nod][i].second;
if(T >= t )
if(viz[X][ T - t])
{sol = max(sol,x[ X ][ T- t]);
ok = true;}
}
return sol;
}
void solve(){
viz[ 1 ][ 0 ] = true;
int i,j,sum;
bool ok;
for(j = 1; j <= Tmax ; j++)
for(i = 1; i <= n; i++)
{ok = false;
sum = supremum(i,j,ok);
if(ok || x[i][j-1])
{x[i][j] = max(x[i][j-1],sum) + cost[i][j];
viz[i][j] = true;
}
}
}
void afisare(){
freopen("amenzi.out","w",stdout);
int i,a,b;
for(i = 1; i <= p; i++)
{scanf("%d %d",&a,&b);
printf("%d\n",x[a][b]);
}
}
int main(){
citire();
solve();
afisare();
return 0;}