// 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;
}