#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<set>
#include<algorithm>
#include<map>
#include<vector>
#include<queue>
#include<iostream>
#include<string>
#include<cmath>
#define M 20010
#define N 510
#define maxl 2000100
#define mmt(a) memset(a,0,sizeof(a));
#define FOR(i,a,b) for(i=(a);i<=(b);i++)
#define ROF(i,a,b) for(i=(a);i>=(b);i--)
typedef long long LL;
using namespace std;
int pre[M],last[N],e[M],w[M],len=0,q[maxl],dis[N],inq[N],inf,dp[N][N],n,m,K,ec,g[N][N],b[N][N],r[N],c[N][N];
void add(int x,int y,int z){pre[++len]=last[x];last[x]=len;e[len]=y;w[len]=z;}
int Nxt(int x){if (x==maxl-1) return 1;return x+1;}
void spfa(int v0)
{
memset(dis,20,sizeof(dis));mmt(inq);
dis[v0]=0;int h=0,t=1;q[1]=v0;inq[v0]=1;
while (h!=t)
{
h=Nxt(h);int u=q[h];
for(int p=last[u];p;p=pre[p])
{
int v=e[p],W=w[p];
if (dis[u]+W<dis[v])
{
dis[v]=dis[u]+W;
if (!inq[v])
{
t=Nxt(t);
q[t]=v;
inq[v]=1;
}
}
}
inq[u]=0;
}
}
void DP(int L,int R)
{
if (L==R) {dp[L][R]=c[L][R];return;}
if (dp[L][R]<=100000000) return;
dp[L][R]=c[L][R];
int k;
FOR(k,L,R-1)
{
DP(L,k);DP(k+1,R);
dp[L][R]=min(dp[L][R],dp[L][k]+dp[k+1][R]+K);
}
}
void initg(){mmt(pre);mmt(last);len=0;}
int main()
{
scanf("%d%d%d%d",&n,&m,&K,&ec);
memset(g,20,sizeof(g));inf=g[0][0];
int i,j,k,l,t1,t2,t3,dd;
FOR(i,1,ec)
{
scanf("%d%d%d",&t1,&t2,&t3);
g[t1][t2]=min(g[t1][t2],t3);
g[t2][t1]=min(g[t2][t1],t3);
}
scanf("%d",&dd);
FOR(i,1,dd)
{
scanf("%d%d%d",&t1,&t2,&t3);
FOR(j,t2,t3) b[t1][j]=1;
}memset(dp,20,sizeof(dp));
FOR(i,1,n) FOR(j,i,n)
{
initg();
mmt(r);
FOR(k,i,j)
FOR(l,1,m)
if (b[l][k]) r[l]=1;
FOR(k,1,m) FOR(l,1,m)
if (!r[k]&&!r[l]&&g[k][l]!=inf) add(k,l,g[k][l]);
spfa(1);
if (dis[m]==inf) c[i][j]=inf;
else c[i][j]=dis[m]*(j-i+1);
}
DP(1,n);
printf("%d\n",dp[1][n]);
}