#include <stdio.h>
#define MAX 152
typedef struct nod
{
int x, cost;
nod *adr_urm;
}*pnod;
pnod l[MAX], ll[MAX];
int n, m, k, q, xx, yy, max_timp;
int qq[1001], qt[1001] , px[82], py[82];
long int c[20][70];
void citire ();
void add ( int i, int j, int cost );
void add1 ( int i, int j, int cost );
void solve ();
void init ();
void dinamica ();
void afisare ();
inline int max ( int i, int j, int jj )
{
int m = -1;
if ( j > jj )
return 0;
for ( j = j; j <= jj; j++ )
if ( c[i][j] > m )
m = c[i][j];
return m;
}
int main ()
{
freopen ( "amenzi.in", "r", stdin );
freopen ( "amenzi.out", "w", stdout );
citire ();
solve ();
afisare ();
return 0;
}
void citire ()
{
int i, x, y, cost;
scanf ( "%d %d %d %d", &n, &m, &k, &q );
for ( i = 1; i <= m; i++ )
{
scanf ( "%d %d %d", &x, &y, &cost );
// printf ( "%d %d %d\n", x, y, cost );
add ( x, y, cost );
add ( y, x, cost );
}
for ( i = 1; i <= k; i++ )
{
scanf ( "%d %d %d", &x, &y, &cost );
//printf ( "%d %d %d\n", x, y, cost );
add1 ( x, y, cost );
}
for ( i = 1; i <= q; i++ )
{
scanf ( "%d %d", &xx, &yy );
px[i] = xx;
py[i] = yy;
if ( yy > max_timp )
max_timp = yy;
}
// printf ( "%d %d\n", x, y );
// pnod p;
// for ( p = ll[2]; p; p = p->adr_urm )
// printf ( "%d %d\n", p->x, p->cost );
}
void add ( int i, int j, int cost )
{
pnod p = new nod;
p->x = j;
p->cost = cost;
p->adr_urm = l[i];
l[i] = p;
}
void add1 ( int i, int j, int cost )
{
pnod p = new nod;
p->x = j;
p->cost = cost;
p->adr_urm = ll[i];
ll[i] = p;
}
void solve ()
{
init ();
dinamica ();
}
void init ()
{
int i, j;
for ( i = 1; i <= n; i++ )
for ( j = 0; j <= max_timp + 1; j++ )
c[i][j] = 0;
}
void dinamica ()
{
pnod p, p1;
int i, j, ind, z, aux, cost, jj, prim, ultim, timp, maxim;
prim = ultim = 1;
qq[1] = 1;
qt[1] = 0;
for ( prim = 1; prim <= ultim; prim++ )
{
i = qq[prim];
timp = qt[prim];
for ( p = l[i]; p; p = p->adr_urm )
{
j = p->x;
cost = p->cost;
aux = timp + p->cost;
//ultim++;
//qq[ultim] = j;
ind = 0;
for ( p1 = ll[j]; p1; p1 = p1->adr_urm )
{
jj = p1->x - cost;
if ( timp + cost > p1->x )
continue;
ind = 1;
maxim = max ( i, 0, jj );
if ( c[j][p1->x] < maxim + p1->cost )
{
c[j][p1->x] = maxim + p1->cost;
//if ( aux <= max_timp )
//{
ultim++;
qq[ultim] = j;
qt[ultim] = p1->x;
//}
//if ( p1->x > aux )
// aux = p1->x;
}
}
if ( !ind )
{
for ( z = 0; z <= max_timp; z++ )
if ( c[j][z + cost] < c[i][z] )
c[j][z + cost] = c[i][z];
ultim++;
qq[ultim] = j;
qt[ultim] = aux;
}
if ( prim >= 100 )
break;
}
}
}
void afisare ()
{
int i;
for ( i = 1; i <= q; i++ )
printf ( "%d\n", max ( px[i], 0, py[i] ) );
}