#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e3+10;
int n,m,k,e,d,tot=0;
struct node{
int p,l,r;
}q[maxn];
ll cost[maxn][maxn],close1[maxn][maxn],value[maxn],dp[maxn];
vector< pair<ll,ll> > edge[maxn];
ll dis[maxn],vis[maxn];
void Dijkstra(int s){
for(int i=1;i<=n;i++){
dis[i]=pow(2,31)-1;
}
dis[s]=0;
priority_queue< pair<ll,ll> >heap;
heap.push(make_pair(0,s));
while(heap.size()){
ll u=heap.top().second;
heap.pop();
vis[u]=1;
int siz=edge[u].size();
for(int i=0;i<siz;i++){
long long v=edge[u][i].first;
if(vis[v]) continue;
if(dis[v]>dis[u]+edge[u][i].second){
dis[v]=dis[u]+edge[u][i].second;
heap.push(make_pair(-dis[v],v));
}
}
}
}
int main(){
scanf("%d%d%d%d",&n,&m,&k,&e);
for(int i=1;i<=e;i++){
ll u,v,w;
scanf("%lld%lld%lld",&u,&v,&w);
edge[u].push_back(make_pair(v,w));
edge[v].push_back(make_pair(u,w));
}
scanf("%d",&d);
for(int i=1;i<=d;i++){
scanf("%d%d%d",&q[i].p,&q[i].l,&q[i].r);
for(int j=q[i].l;j<=q[i].r;j++){
close1[q[i].p][j]=1;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
memset(vis,0,sizeof(vis));
for(int r=i;r<=j;r++){
for(int l=1;l<=m;l++){
if(close1[l][r]) vis[l]=1;
}
}
Dijkstra(1);
cost[i][j]=dis[m];
}
}
memset(dp,0x7f,sizeof(dp));
for(int i=1;i<=n;i++){
dp[i]=cost[1][i]*i;
for(int j=i-1;j>=0;j--){
dp[i]=min(dp[i],dp[j]+cost[j+1][i]*(i-j)+k);
}
}
printf("%lld",dp[n]);
return 0;
}