const nrmaxintersectii=151;
nrmaxtimp=3501;
nramenzi=12000;
type lsi=^nod;
nod=record inf,cost:longint;
urm :lsi;
end;
var j,x,y,c,i,n,m,k,p:longint;
v:array[0..nrmaxtimp,1..nrmaxintersectii]of longint;
graf:array[1..nrmaxintersectii] of lsi;
amenzist,amenzisf:array[1..nrmaxintersectii] of lsi;
pe:lsi;
procedure add(var cap:lsi;el,cost:longint);
var P:lsi;
begin
new(p);
p^.urm:=cap;
p^.inf:=el;
p^.cost:=cost;
cap:=p;
end;
procedure add2(var cap:lsi;el,cost:longint);
var P:lsi;
begin
new(p);
p^.urm:=nil;
p^.inf:=el;
p^.cost:=cost;
cap^.urm:=p;
cap:=p;
end;
begin
assign(input,'amenzi.in');
reset(input);
readln(n,m,k,p);
for i:=1 to m do
begin
readln(x,y,c);
add(graf[y],x,c);
add(graf[x],y,c);
end;
{amenzist:=amenzisf;}
for i:=1 to k do
begin
readln(x,y,c);
add2(amenzisf[x],y,c);
if amenzist[x]=nil then
amenzist[x]:=amenzisf[x];
end;
for i:=0 to nrmaxtimp do
for j:=1 to n do
v[i,j]:=-1;
v[0,1]:=0;
for i:=1 to nrmaxtimp do
begin
for j:=1 to n do
{if v[i-1,j]<>-1 then}
begin
v[i,j]:=v[i-1,j];
pe:=graf[j];
while pe<>nil do
begin
if (i-pe^.cost>=0) and (v[i,j]<v[i-pe^.cost,pe^.inf]) then
v[i,j]:=v[i-pe^.cost,pe^.inf];
pe:=pe^.urm;
end;
end;
{if v[i,j]<v[i-1,j] then
v[i,j]:=v[i-1,j];}
for j:=1 to n do
begin
if v[i,j]<v[i-1,j] then
v[i,j]:=v[i-1,j];
while (amenzist[j]<>nil)and(amenzist[j]^.inf=i) do
begin
if v[i,j]<>-1 then
v[i,j]:=v[i,j]+amenzist[j]^.cost;
amenzist[j]:=amenzist[j]^.urm;
end
end;
end;
assign(output,'amenzi.out');
rewrite(output);
for i:=1 to p do
begin
readln(x,y);
writeln(v[y,x]);
end;
close(output);
end.