# include <iostream>
# include <cstdio>
# include <queue>
# include <cmath>
# include <cstring>
# define ll long long
using namespace std;
queue<int> q;
int n,m,k,e,d,cnt;
int h[21],nxt[1001000],to[1001000];
ll w[1001000],mon[110][110],f[110],dis[21];
bool vis1[21][110],vis2[21];
void add(int x,int y,ll z){
nxt[++cnt]=h[x];
h[x]=cnt;
to[cnt]=y;
w[cnt]=z;
}
ll spfa(int l,int r){
for(int i=1;i<=n;i++)
dis[i]=1738007481131,vis2[i]=0;
dis[1]=0;
q.push(1);
while(!q.empty()){
int x=q.front();q.pop();
vis2[x]=0;
for(int i=h[x];i;i=nxt[i]){
int y=to[i];
bool flag=0;
for(int j=l;j<=r;j++){
if(vis1[y][j]){
flag=1;
break;
}
}
if(flag) continue;
if(dis[y]>dis[x]+w[i]){
dis[y]=dis[x]+w[i];
if(!vis2[y]){
vis2[y]=1;
q.push(y);
}
}
}
}
return dis[m];
}
int main(){
scanf("%d%d%d%d",&n,&m,&k,&e);
for(int i=1;i<=e;i++){
int a,b;
ll c;
scanf("%d%d%lld",&a,&b,&c);
add(a,b,c),add(b,a,c);
}
scanf("%d",&d);
for(int i=1;i<=d;i++){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
for(int j=b;j<=c;j++)
vis1[a][j]=1;
}
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j++)
mon[i][j]=spfa(i,j);
memset(f,122,sizeof(f));
for(int i=1;i<=n;i++)
f[i]=mon[1][i]*i;
for(int i=1;i<=n;i++)
for(int j=1;j<i;j++)
if(f[i]>f[j]+k+mon[j+1][i]*(i-j))
f[i]=f[j]+k+mon[j+1][i]*(i-j);
printf("%lld\n",f[n]);
return 0;
}