#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10;
int n,m,k,e,head[N];
struct FF{
int next,f,w,to;
}len[N];
struct FFk{
int l,r;
}po[N];
int day[2100][2100],dp[N],d;
void init(){
int tot=0,x,y,z;
scanf("%lld%lld%lld%lld",&n,&m,&k,&e);
for(int i=1;i<=e;i++){
scanf("%lld%lld%lld",&x,&y,&z);
len[++tot].to=y,len[tot].f=x,len[tot].next=head[x],len[tot].w=z,head[x]=tot;
len[++tot].to=x,len[tot].f=y,len[tot].next=head[y],len[tot].w=z,head[y]=tot;
}
for(int i=1;i<=n;i++)po[i].l=-1,po[i].r=-1;
scanf("%lld",&d);
for(int i=1;i<=d;i++){
scanf("%lld",&x);
scanf("%lld%lld",&po[x].l,&po[x].r);
}
return;
}
int SPFA(int l,int r){
int dis[5000];bool vis[5000];
for(int i=1;i<=m;i++)dis[i]=1000000000000;
memset(vis,0,sizeof(vis));
dis[1]=0,vis[1]=1;
queue<int> q;q.push(1);
while(!q.empty()){
int u=q.front();q.pop();vis[u]=0;
for(int i=head[u];i;i=len[i].next){
int f=len[i].f,to=len[i].to,w=len[i].w;
if(po[to].l>r || po[to].r<l){
if(dis[to]>dis[u]+w){
if(!vis[to])q.push(to);
dis[to]=dis[u]+w;vis[to]=1;
}
}
}
}
return dis[m];
}
signed main(){
init();
for(int i=1;i<=n;i++){
for(int j=i;j<=n;j++)
day[i][j]=SPFA(i,j);
}
dp[0]=-k;
/*for(int i=1;i<=n;i++){
for(int j=i;j<=n;j++)
printf("%lld ",day[i][j]);puts(" ");
}*/
for(int i=1;i<=n;i++)
dp[i]=100000000000000;
for(int i=1;i<=n;i++){
dp[i]=i*day[1][i];
for(int j=i-1;j>=0;j--)
dp[i]=min(dp[j]+day[j+1][i]*(i-j)+k,dp[i]);
}
cout<<dp[n];
/*for(int i=1;i<=n;i++)
printf("%lld %lld\n",po[i].l,po[i].r);
for(int i=1;i<=n;i++)
printf("%lld ",day[i][i]);*/
return 0;
}