#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=300005;
char buf[1 << 20], *p1, *p2;
#define gc() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 20, stdin), p1 == p2) ? EOF : *p1++)
long long maxx(int a,int b){
return a>b?a:b;
}
long long rd()
{
int x = 0, f = 1;
char c = gc();
while (!isdigit(c))
{
if (c == '-')
f = -1;
c = gc();
}
while (isdigit(c))
x = x * 10 + (c ^ 48), c = gc();
return x * f;
}
struct node
{
int l, r, val;
friend bool operator<(node a, node b)
{
return a.r < b.r;
}
} a[maxn];
struct seg
{
int l, r, val, tag;
} w[4 * maxn];
int n, m, t[maxn], cnt, k, d;
bool in(int l1, int r1, int l2, int r2)
{
return (l1 >= l2 && r1 <= r2);
}
bool out(int l1, int r1, int l2, int r2)
{
return (l1 > r2 || l2 > r1);
}
inline void pushup(int u)
{
w[u].val = maxx(w[u <<1].val, w[u <<1 |1].val);
}
inline void maketag(int u, int k)
{
w[u].val += k;
w[u].tag += k;
}
inline void pushdown(int u)
{
if (!w[u].tag)
return;
maketag(u <<1, w[u].tag);
maketag(u <<1 |1, w[u].tag);
w[u].tag = 0;
}
inline void build(int u, int l, int r)
{
w[u] = {l, r, 0, 0};
if (l == r)
{
return;
}
else
{
int mid = (l + r) >>1;
build(u <<1, l, mid);
build(u <<1 |1, mid +1, r);
}
}
inline void add(int u, int L, int R, int k)
{
if (in(w[u].l, w[u].r, L, R))
{
maketag(u, k);
}
else
{
if (!out(w[u].l, w[u].r, L, R))
{
pushdown(u);
add(u <<1, L, R, k);
add(u <<1 |1, L, R, k);
pushup(u);
}
}
}
inline long long query(int u, int L, int R)
{
if (in(w[u].l, w[u].r, L, R))
{
return w[u].val;
}
else
{
if (!out(w[u].l, w[u].r, L, R))
{
pushdown(u);
return maxx(query(u <<1, L, R), query(u <<1 |1, L, R));
}
else
{
return 0;
}
}
}
inline long long gt(int x)
{
return lower_bound(t + 1, t + cnt + 1, x) - t;
}
inline void work()
{
n=rd();m=rd();k=rd();d=rd();
cnt = 0;
for (int i = 1; i <= m; i++)
{
int x, y, val;
x=rd();y=rd();val=rd();
a[i] = node{x - y, x, val};
t[++cnt] = a[i].l;
t[++cnt] = a[i].r;
}
sort(t + 1, t + cnt + 1);
cnt = unique(t + 1, t + cnt + 1) - t - 1;
build(1, 0, cnt - 1);
for (int i = 1; i <= m; i++)
{
a[i].l = gt(a[i].l);
a[i].r = gt(a[i].r);
}
sort(a + 1, a + m + 1);
int ans = 0;
int q = 1;
for (int i = 1; i <= cnt; i++)
{
add(1, 0, i - 1, -1 * d * (t[i] - t[i - 1]));
while (q <= m && a[q].r == i)
{
add(1, 0, a[q].l, a[q].val);
q++;
}
ans = maxx(ans, query(1, gt(t[i] - k), i - 1));
if (i + 1 <= cnt)
{
add(1, i + 1, i + 1, ans);
}
}
cout << ans << "\n";
}
signed main()
{
int cas, T;
cas=rd();
T=rd();
while (T--)
{
work();
}
return 0;
}