#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()
{
  //freopen("ttt.out","w",stdout);
  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);
    //printf("%d %d %d\n",i,j,dp[i][j]);
    //dp[i][j]=c[i][j]=dis[m]*(j-i+1);
  }
  DP(1,n);
  printf("%d\n",dp[1][n]);
}