#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,m,h[10005],k,ee,cnt,f[1055],bad[100005],dis[100004],w[1005][1005],dp[1005],a[1005][1005];
struct node
{
int v,nxt,w;
} e[100055];
struct nd
{
int dis,x;
bool operator<(const nd &a)const
{
return a.dis < dis;
}
};
void add(int u,int v,int w)
{
e[++cnt].v=v;
e[cnt].w=w;
e[cnt].nxt=h[u];
h[u]=cnt;
}
priority_queue<nd>q;
void dij()
{
for(int i=1; i<=m; i++)dis[i]=1e9;
memset(f,0,sizeof(f));
dis[1]=0;
q.push({0,1});
while(!q.empty())
{
int xx=q.top().x,d=q.top().dis;
q.pop();
if(f[xx])continue;
f[xx]=1;
for(int i=h[xx]; i; i=e[i].nxt)
{
int v=e[i].v;
if(bad[v])continue;
if(dis[xx]+e[i].w<=dis[v])
{
dis[v]=dis[xx]+e[i].w;
q.push({dis[v],v});
}
}
}
}
signed main()
{
cin>>n>>m>>k>>ee;
for(int i=1; i<=ee; i++)
{
int u,v,w;
cin>>u>>v>>w;
add(u,v,w);
add(v,u,w);
}
int d;
cin>>d;
for(int i=1; i<=d; i++)
{
int p,x,y;
cin>>p>>x>>y;
for(int j=x; j<=y; j++)
{
w[j][++w[j][0]]=p;
}
}
for(int i=1; i<=n; i++)
{
for(int j=i; j<=n; j++)
{
for(int k=1; k<=m; k++)bad[k]=0;
for(int k=i; k<=j; k++)
{
for(int p=1; p<=w[k][0]; p++)
bad[w[k][p]]=1;
}
dij();
a[i][j]=dis[n];
}
}
for(int i=1; i<=n; i++)
{
dp[i]=1e10;
for(int j=0; j<i; j++)
{
dp[i]=min(dp[i],dp[j]+(a[j+1][i])*(i-j)+k);
}
}
cout<<dp[n]-k;
}