#include <bits/stdc++.h>
using namespace std;
const int N = 5e5 + 5;
int seg[N << 2], lz[N << 2];
int q, n, m, c, c0, k, t[N];
set<pair<int, int>> s;
vector<int> vec[N];
long long ans;
struct Friend {
  int a, b, t;
} f[N];
inline void add(int id, int x) { seg[id] += x, lz[id] += x; }
inline void shift(int id) {
  add(id << 1 | 1, lz[id]);
  add(id << 1, lz[id]), lz[id] = 0;
}
void build(int id = 1, int st = 0, int en = k) {
  seg[id] = c0 - t[st], lz[id] = 0;
  if (en - st > 1) {
    int mid = st + en >> 1;
    build(id << 1, st, mid);
    build(id << 1 | 1, mid, en);
  }
}
void update(int p, int x, int id = 1, int st = 0, int en = k) {
  if (en <= p) return;
  if (p <= st) return add(id, x);
  shift(id);
  int mid = st + en >> 1;
  update(p, x, id << 1, st, mid);
  update(p, x, id << 1 | 1, mid, en);
  seg[id] = max(seg[id << 1], seg[id << 1 | 1]);
}
int get(int p, int id = 1, int st = 0, int en = k) {
  if (en <= p) return -1e9;
  if (p <= st) return seg[id];
  shift(id);
  int mid = st + en >> 1;
  return max(get(p, id << 1, st, mid), get(p, id << 1 | 1, mid, en));
}
inline void compress() {
  t[++k] = m;
  for (int i = 0; i < n; i++) t[++k] = f[i].t;
  sort(t, t + ++k);
  k = unique(t, t + k) - t;
  for (int i = 0; i < n; i++)
    vec[f[i].t = lower_bound(t, t + k, f[i].t) - t].push_back(i);
}
inline bool move(int x) {
  if (s.empty()) return !x;
  int p = s.begin()->second;
  int l = min(f[p].a, c - get(f[p].t));
  if (l <= x) {
    ans += 1LL * l * f[p].b, update(f[p].t, l);
    return s.erase(s.begin()), move(x - l);
  }
  ans += 1LL * x * f[p].b, update(f[p].t, x);
  return f[p].a -= x, true;
}
inline void prepare() {
  for (int i = 0; i < k; i++) vec[i].clear();
  k = ans = 0, s.clear();
}
inline void read_input() {
  scanf("%d%d%d%d", &n, &m, &c, &c0);
  for (int i = 0; i < n; i++) scanf("%d%d%d", &f[i].t, &f[i].a, &f[i].b);
}
inline void solve() {
  compress(), build();
  for (int i = 0; i < k; i++) {
    int cur = get(i);
    if (cur < 0 && !move(-cur)) {
      ans = -1;
      break;
    }
    for (auto x : vec[i]) s.insert({f[x].b, x});
  }
  printf("%lld\n", ans);
}
int main() {
  for (scanf("%d", &q); q--; prepare()) read_input(), solve();
}
