#include<bits/stdc++.h>
#define f(i,l,r) for(int i=l;i<=r;i++)
#define F if
#define E else
using namespace std;
struct edge
{
int x1,x2,l,c,v=0;
}e[4010];
int m,s,minn=2147483647;
int read()
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
F(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=x*10+ch-48;
ch=getchar();
}
return x*f;
}
void find(int cur,int v,int t)
{
int flg=0;
F(cur==v)
{
minn=min(minn,t);
return;
}
f(i,1,m)
{
F(e[i].v==0&&(e[i].x1==cur||e[i].x2==cur))
{
F(t+e[i].l<=e[i].c)
{
e[i].v=1;
t+=e[i].l;
F(e[i].x1==cur)
find(e[i].x2,v,t);
E
find(e[i].x1,v,t);
t-=e[i].l;
e[i].v=0;
}
E
{
F(e[i].l<e[i].c)
{
int o=t;
e[i].v=1;
t=s+e[i].l;
F(e[i].x1==cur)
find(e[i].x2,v,t);
E
find(e[i].x1,v,t);
t=o;
e[i].v=0;
}
E
return;
}
flg=1;
}
}
F(flg==0)
return;
return;
}
int main()
{
int n,q;
n=read();
m=read();
s=read();
q=read();
f(i,0,m-1)
{
int a=read(),b=read(),l=read(),c=read();
e[i].x1=a;
e[i].x2=b;
e[i].l=l;
e[i].c=c;
}
f(i,1,q)
{
int u=read(),v=read(),t=read();
find(u,v,t);
cout<<minn<<endl;
minn=2147483647;
}
}