/*
cl[i][1-m] iÎïÆ·ÔÚµÚiÌìÊÇ·ñÔÊÐí·ÃÎÊ
can_vis[]+spfa
dp[i]=min(dp[i],dp[j]+co[j+1][i]*(i-j)+k) ::dp 0x3f ::dp[i]=co[1][i]*i
co[i][j]=dis[m]
:::多组数据 不要用memset
*/
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
//#include<queue>
//#include<vector>
#include<bits/stdc++.h>
#define ll long long
#define ddd printf("-----------------------\n");
using namespace std;
const int maxn=2e2+10;
int n,m,k,e,d;
int head[maxn],to[maxn<<1],nxt[maxn<<1],w[maxn<<1],tot;
ll dis[maxn],vis[maxn],co[maxn][maxn],dp[maxn];
int cl[maxn][maxn],cant_vis[maxn];
void add(int a,int b,int val){
to[++tot]=b,nxt[tot]=head[a],head[a]=tot;w[tot]=val;
}
void spfa()
{
// memset(dis,0x3f,sizeof(dis));
// memset(vis,0,sizeof(vis));
for(int i=1;i<=m;i++) dis[i]=0x3f3f3f3f,vis[i]=0;
queue<int> q; q.push(1);dis[1]=0;vis[1]=1;
while(!q.empty())
{
int u=q.front();q.pop();vis[u]=0;
for(int i=head[u];i;i=nxt[i])
{
int v=to[i]; if(cant_vis[v]) continue;
if(dis[v]>dis[u]+w[i])
{
dis[v]=dis[u]+w[i];
if(vis[v]==0) vis[v]=1,q.push(v);
}
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin>>n>>m>>k>>e;
for(int i=1;i<=e;i++){
int a,b,val;cin>>a>>b>>val;
add(a,b,val),add(b,a,val);
}
cin>>d;
for(int i=1;i<=d;i++){
int p,a,b;cin>>p>>a>>b;
for(int j=a;j<=b;j++) cl[p][j]=1;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){//
memset(cant_vis,0,sizeof(cant_vis));
for(int mt=1;mt<=m;mt++)
for(int tim=i;tim<=j;tim++)//
if(cl[mt][tim]==1) cant_vis[mt]=1;
spfa();
co[i][j]=dis[m];
}
}
memset(dp,0x3f,sizeof(dp));
for(int i=1;i<=n;i++){
dp[i]=co[1][i]*i;
for(int j=0;j<=i-1;j++){
dp[i]=min(dp[i],dp[j]+co[j+1][i]*(i-j-1+1)+k);
}
}
cout<<dp[n]<<'\n';
return 0;
}