#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define int ll
#define pint pair<int,int>
#define f first
#define s second
#define mp make_pair
inline ll read(){
ll x=0;
short f=1;
char c=getchar();
while(c>57||c<48){
if(c==45) f=-1;
c=getchar();
}
while(c<58&&c>47){
x=(x<<1)+(x<<3)+(c^48);
c=getchar();
}
return x*f;
}
inline void write(ll x){
if(x>>63) putchar(45),x=~x+1;
if(9-x>>63) write(x/10);
putchar(x%10|48);
}
int id=read(),t=read(),n,m,k,d;
int mx[1000005],lp[1000005],rp[1000005],lz[1000005];
#define ls (id<<1)
#define rs (ls|1)
#define mid (l+r>>1)
#define M (lp[id]+rp[id]>>1)
#define pu(id) mx[id]=max(mx[ls],mx[rs])
#define pd(id) mx[ls]+=lz[id],mx[rs]+=lz[id],lz[ls]+=lz[id],lz[rs]+=lz[id];lz[id]=0
void build(int id,int l,int r){
lp[id]=l;rp[id]=r;mx[id]=0;
if(l==r) return;
build(ls,l,mid);
build(rs,mid+1,r);
}
void modify(int id,int ql,int qr,int k){
if(lp[id]>qr||rp[id]<ql) return;
if(ql<=lp[id]&&rp[id]<=qr){
lz[id]+=k;
mx[id]+=k;
return;
}
pd(id);
modify(ls,ql,qr,k);
modify(rs,ql,qr,k);
pu(id);
}
int getmax(int id,int ql,int qr){
if(lp[id]>qr||rp[id]<ql) return 0;
if(ql<=lp[id]&&rp[id]<=qr) return mx[id];
pd(id);
return max(getmax(ls,ql,qr),getmax(rs,ql,qr));
}
pair<pint,int>ev[100005];
int s[200005],np;
int dp[200005];
signed main(){
while(t--){
n=read(),m=read(),k=read(),d=read();
for(int i=1;i<=m;i++){
int rp=read(),lp=rp-read()+1,v=read();
ev[i]=mp(mp(rp,lp),v);
s[i]=lp;s[i+m]=rp;
}
sort(s+1,s+1+m+m);
int rl=unique(s+1,s+m+m+1)-s-1;
build(1,1,rl);
for(int i=1;i<=m;i++){
ev[i].f.f=lower_bound(s+1,s+1+rl,ev[i].f.f)-s;
ev[i].f.s=lower_bound(s+1,s+1+rl,ev[i].f.s)-s;
}
sort(ev+1,ev+1+m);
np=1;
for(int i=1;i<=rl;i++){
while(ev[np].f.f==i&&np<=m){
modify(1,1,ev[np].f.s,ev[np].s);
np++;
}
int pp=lower_bound(s+1,s+rl+1,s[i]-k+1)-s;
dp[i]=getmax(1,pp,i-1)-d-d*s[i];
int pos=max(0ll,i-1-!(s[i-1]^s[i]-1));
// write(pos),putchar(10);
dp[i]=max(dp[i],getmax(1,i,i)+dp[pos]-d);
dp[i]=max(dp[i],dp[i-1]);
modify(1,i,i,dp[pos]+s[i]*d);
}
// putchar(10);
// for(int i=0;i<=rl;i++) write(dp[i]),putchar(10);
write(dp[rl]);putchar(10);
}
}