// A cans -> B cans #include <bits/stdc++.h> // #include <atcoder/all> #include <iostream> #include <math.h> using namespace std; // using namespace atcoder; // using mint = modint998244353; // using mint = modint1000000007; using vi = vector<int>; using vvi = vector<vector<int>>; using ll = long long; template <class T> using max_heap = priority_queue<T>; template <class T> using min_heap = priority_queue<T, vector<T>, greater<>>; #define rep(i, n) for (int i = 0; i < (int)(n); i++) #define rep2(i, f, n) for (int i = (int) f; i < (int)(n); i++) #define repd(i, n, l) for (int i = (int) n; i >= (int) l; i--) const ll inf = ll(1e9+7); int main() { int n, m; cin >> n >> m; vector<vector<ll>> C; rep(i, n){ ll a, b, c; cin >> a >> b >> c; C.push_back({a, b, c}); } sort(C.begin(), C.end(), [](vector<ll> &left, vector<ll> &right){ ll a1 = left[1] * left[2]; ll b1 = left[0] - left[1]; ll a2 = right[1] * right[2]; ll b2 = right[0] - right[1]; if (a1 * b2 > a2 * b1) return true; else if (a1 * b2 == a2 * b1 && left[0] < right[0]) return true; else return false; }); vector<ll> ans(m+1, 0); for (int p = 1; p <= m; p++){ ans[p] = max(ans[p], ans[p-1]); ll now = p; for (auto c : C){ if (c[0] > now) continue; ll temp = 0; ll now_i = 0; now -= c[0]; now_i += c[1]; temp += c[1]*c[2]; ans[p] = max(ans[p], temp + ans[now]); while (now + now_i >= c[0]){ now -= (c[0] - c[1]); temp += c[1] * c[2]; ans[p] = max(ans[p], temp + ans[now]); } } } for (int i = 1; i <= m; i++){ cout << ans[i] << endl; } return 0; }