#include<bits/stdc++.h>
#define ls(x) x << 1
#define rs(x) x << 1 | 1
#define _for(i,x,y) for(int i = (x);i<=(y);i ++)
using namespace std;
typedef long long ll;
typedef pair<int,ll> pii;
const int N = 200010;
const ll inf = 2e18;
int lsh[N];
int x[N],y[N];
int ln;
ll v[N];
vector<pii> E[N];
ll f[N];
int n,m,k,d;
// segment tree
struct info{
int l,r;ll tag,mx;
}t[N * 4];
void pushup(int u){
t[u].mx= max(t[ls(u)].mx,t[rs(u)].mx);
return;
}
void build(int u,int l,int r){
t[u].l = l,t[u].r = r;
if(l == r){t[u].tag = t[u].mx = 0ll;return;}
int mid = l + r >> 1;
build(ls(u),l,mid),build(rs(u),mid+1,r);
pushup(u);
return;
}
void maketag(int u,int x){
t[u].tag += x,t[u].mx += x;
return;
}
void pushdown(int u){
maketag(ls(u),t[u].tag),maketag(rs(u),t[u].tag);
t[u].tag = 0ll;
return;
}
void modify(int u,int l,int r,int x){
if(t[u].l>=l && t[u].r<=r)maketag(u,x);
else if(t[u].l <= r && t[u].r >= l){
pushdown(u);
modify(ls(u),l,r,x),modify(rs(u),l,r,x);
pushup(u);
}
return;
}
ll query(int u,int l,int r){
if(t[u].l >= l && t[u].r <= r)return t[u].mx;
else if(t[u].l <= r && t[u].r >= l){
pushdown(u);
return max(query(ls(u),l,r),query(rs(u),l,r));
}
return -inf;
}
//solve
void solve(){
scanf("%d%d%d%d",&n,&m,&k,&d);
_for(i,1,m*2)E[i].clear();
memset(t,0,sizeof t);
ln = 0;
_for(i,1,m){
scanf("%d%d%lld",&x[i],&y[i],&v[i]);
int L = x[i] - y[i] + 1,R = x[i];
lsh[++ln] = L,lsh[++ln] = R;
}
sort(lsh+1,lsh+1+ln);
ln = unique(lsh+1,lsh+1+ln)-lsh-1;
_for(i,1,m){
int L = lower_bound(lsh+1,lsh+1+ln,x[i] - y[i] + 1) - lsh;
int R = lower_bound(lsh+1,lsh+1+ln,x[i]) - lsh;
E[R].push_back({L,v[i]});
}
build(1,1,ln);
_for(i,1,ln){
modify(1,i,i,((i==1||lsh[i] - lsh[i-1] > 1)?f[i-1]:f[i-2]) - d);
if(i > 1)modify(1,1,i-1,-(ll)d * (lsh[i] - lsh[i-1]));
for(auto x:E[i])modify(1,1,x.first,x.second);
int st = lower_bound(lsh+1,lsh+1+ln,lsh[i] - k + 1) - lsh;
ll cur = query(1,st,i);
f[i] = max(f[i-1],cur);
}
printf("%lld\n",f[ln]);
}
int c,T;
int main(){
//freopen("P9871_1 (5).in","r",stdin);
scanf("%d%d",&c,&T);
while(T--)solve();
return 0;
}