#include<bits/stdc++.h>
#define INF 10000000000000
using namespace std;
typedef pair<long long,long long> P;
struct edge{int to,cost;};
int V;
vector<edge> G[200000];
long long d[200000];
void dkstr(int);
int main(){
  int n,m,r,q;
  cin >> n >> m >> r >> q;
  V=n+r;
  //
  for(int i=0;i<m;i++){
    int a,b,c;
    cin >> a >> b >> c;
    G[b-1].push_back({a-1,c});
  }
  for(int i=0;i<n;i++){
    G[n+(i+1)%r].push_back({i,0});
  }
  //cout << "aaaaa" << endl;
  //
  vector<vector<long long> >h(n,vector<long long>(r,INF));
  for(int i=0;i<r;i++){
    dkstr(n+i);
    for(int j=0;j<n;j++){
      h[j][i]=d[j];
    }
  }
  //
  //cout << "aaa" << endl;
  long long co=0;
  for(int i=0;i<q;i++){
    long long x,y,z;
    cin >> x >> y >> z;
    long long mi=INF;
    for(int j=0;j<r;j++){
      mi=min(mi,h[x-1][j]+h[y-1][j]);
    }
    co += max(0LL,z-mi);
  }
  cout << co << endl;
  return 0;
}
void dkstr(int s){
  priority_queue<P,vector<P>,greater<P> >que;
  fill(d,d+V,INF);
  d[s]=0;
  que.push(P(0,s));

  while(!que.empty() ){
    P p = que.top(); que.pop();
    int v = p.second;
    if(d[v]<p.first) continue;
    for(int i=0;i<G[v].size();i++){
      edge e = G[v][i];
      if(d[e.to] > d[v] + e.cost){
	  d[e.to] = d[v]+ e.cost;
	  que.push(P(d[e.to],e.to));
      }
    }
  }
}

	
	