#include<bits/stdc++.h>
#define int long long
using namespace std;
int t,n,p,m,d,dp[114514];
bool qwq[3145][3145],now[114514];
struct node{
int to,nxt,val;
}w[114514];
int h[114514],cnt=0;
void Link(int x,int y,int val){
++cnt;
w[cnt].to=y;
w[cnt].nxt=h[x];
w[cnt].val=val;
h[x]=cnt;
return ;
}
int dis[1145141];
bool vis[1145141];
queue<int> q;
void SPFA(int st){
for(int i=1;i<=n;i++) dis[i]=LLONG_MAX;
for(int i=1;i<=n;i++) vis[i]=false;
dis[st]=0; vis[st]=true;
q.push(st);
while(!q.empty()){
int x=q.front();
q.pop();
vis[x]=false;
for(int i=h[x];i!=0;i=w[i].nxt){
int y=w[i].to;
if(dis[y]>dis[x]+w[i].val&&!now[y]){
dis[y]=dis[x]+w[i].val;
if(!vis[y]){
q.push(y);
vis[y]=true;
}
}
}
}
return ;
}
int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<3)+(x<<1)+ch-'0';
ch=getchar();
}
return x*f;
}
signed main(){
t=read(); n=read(); p=read(); m=read();
for(int i=1;i<=m;i++){
int u,v,val;
u=read(); v=read(); val=read();
Link(u,v,val);
Link(v,u,val);
}
d=read();
for(int i=1;i<=d;i++){
int u,l,r;
u=read(); l=read(); r=read();
for(int j=l;j<=r;j++) qwq[j][u]=true;
}
for(int i=1;i<=t;i++) dp[i]=LLONG_MAX;
dp[0]=-p;
for(int i=1;i<=t;i++){
for(int j=1;j<=n;j++) now[j]=false;
for(int j=i;j>=1;j--){
for(int k=1;k<=n;k++){
if(qwq[j][k]) now[k]=true;
SPFA(1);
if(dis[n]==LLONG_MAX) break;
dp[i]=min(dp[i],dp[j-1]+(i-j+1)*dis[n]+p);
}
}
}
printf("%lld\n",dp[t]);
return 0;
}