#include <bits/stdc++.h>

using namespace std;

#define MP make_pair
#define ALL(x) (x).begin(),(x).end()
#define SZ(x) (int((x.size())))
#define fi first
#define se second
#define REP(i, a, n) for (int (i)=(a);(i)<(n);(i)++)
#define PER(i, a, n) for (int (i)=(n)-1;(i)>=(a);(i)--)

typedef long double ld;
typedef long long ll;
typedef vector<int> VI;
typedef pair<int, int> PII;
typedef pair<ll, ll> PLL;
typedef vector<ll> VL;
typedef vector<PLL> VPL;
typedef vector<PII> VPI;

//#ifndef ONLINE_JUDGE
#define dbb(x)        { cerr << #x << " = " << x << "\t";      }
#define db(x)        { dbb(x); cerr << endl; }
#define db2(x, y)    { dbb(x); dbb(y); cerr << endl; }
#define db3(x, y, z)    { dbb(x); dbb(y); dbb(z); cerr << endl; }
//#else
//#define dbb(x)		;
//#define db(x)		;
//#define db2(x,y)	;
//#define db3(x,y,z)	;
//#endif



const ll MOD = 1000000007ll;

ll powmod(ll a, ll b) {
    ll res = 1;
    a %= MOD;
    assert(b >= 0);
    for (; b; b >>= 1) {
        if (b & 1) res = res * a % MOD;
        a = a * a % MOD;
    }
    return res;
}

template<typename t1, typename t2>
inline bool upmax(t1 &a, t2 b) {
    if (a < (t1) b) {
        a = (t1) b;
        return true;
    } else return false;
}

template<typename t1, typename t2>
inline bool upmin(t1 &a, t2 b) {
    if (a > (t1) b) {
        a = (t1) b;
        return true;
    } else return false;
}

template<typename T>
inline T gcd(T a, T b) { return b ? gcd(b, a % b) : a; }

template<typename T>
inline T lcm(T a, T b) { return a * (b / gcd(a, b)); }

template<typename T>
inline T sqr(T a) { return a * a; }

int dx[] = {1, 0, -1, 0, 1, 1, -1, -1};
int dy[] = {0, 1, 0, -1, 1, -1, 1, -1};
int dkx[] = {-1, -1, 1, 1, -2, -2, 2, 2};
int dky[] = {-2, 2, -2, 2, -1, 1, -1, 1};

const int INF = 1000000404;
const ll LINF = 1e18 * (1ll);
const ld PI = 3.14159265358979323846;
const ld EPS = 1e-9;

int SQ = 318;
int timer = 0;


#define N 100100
ll l[N];
ll u[N];
ll b[N];
ll a[N];
int mem[N];
int n, x;

ll now = 0;
multiset<pair<long long, int> > s;

void inc(int i) {

}

void solve() {


    cin >> n >> x;
    vector<pair<ll, int> > v;

    ll now = 0;

    for (int i = 1; i <= n; i++) {
        cin >> b[i] >> l[i] >> u[i];
        ll dif = -l[i] * b[i];
        now -= dif;
        v.push_back(MP(u[i] * x - u[i] * b[i] - dif, i));
    }

    sort(ALL(v));
    reverse(ALL(v));

    ll l = 0, r = 1ll * n * x;
    ll ans = r;
    while (l <= r) {

        ll m = (l + r) >> 1;

        ll k = m / x;
        ll f = m % x;
        ll s = 0;

        for (int i = 0; i < k; i++) {
            s += v[i].first;
        }
        ll d = 0;
        if (k < n) {
            d = v[k].first;
        }
        ll S = s;
        ll max_s = s;
        for (int it = 0; it < n; it++) {
            int i = v[it].second;

            if (it < k) {
                s -= v[it].first;
                s += d;
                ll dif = -::l[i] * b[i];
                ll mx = max(f * ::l[i] - b[i] * ::l[i], f * u[i] - b[i] * u[i]) - dif;
                s += mx;
            } else {
                ll dif = -::l[i] * b[i];
                ll mx = max(f * ::l[i] - b[i] * ::l[i], f * u[i] - b[i] * u[i]) - dif;
                s += mx;
            }

            upmax(max_s, s);
            s = S;
        }
        if (max_s >= now) {
            ans = m;
            r = m - 1;
        } else l = m + 1;

    }

    cout << ans << endl;
}

int main() {

#ifdef HOME
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
#else
    //freopen("input.in", "r", stdin);
    //freopen("output.out", "w", stdout);
#endif

    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    int t = 1;
    //cin >> t;

    while (t--) {

        solve();

    }

    return 0;
}


Measured memory_bytes: 4336