#include <bits/stdc++.h>

using namespace std;

#define pb push_back
#define mp make_pair
#define rep(i,n) for(int i = 0; i < (n); i++)
#define repr(i,b,e) for(int i = (b); i <= (e); i++)

#define pr(x) do{cerr << (#x) << " = " << (x) << endl;}while(0)
#define pri(x,i) do{cerr << (#x) << "[" << i << "] = " << (x[i]) << endl;}while(0)
#define UNIQUE(v) do{ (v).erase( unique(begin(v), end(v)), end(v) ); } while(0)

namespace std {
	template<class S, class T> pair<S, T> operator + (const pair<S, T> &a, const pair<S, T> &b) {return mp<S, T>(a.first + b.first, a.second + b.second);}
	template<class S, class T> pair<S, T> operator - (const pair<S, T> &a, const pair<S, T> &b) {return mp<S, T>(a.first - b.first, a.second - b.second);}
	template<class S, class T> pair<S, T>& operator += (pair<S, T> &a, const pair<S, T> &other) {return a = a + other;}
	template<class S, class T> pair<S, T>& operator -= (pair<S, T> &a, const pair<S, T> &other) {return a = a - other;}
	template<class S, class T> ostream& operator << (ostream& ost, pair<S, T> p) {ost << "(" << p.first << ", " << p.second << ")";return ost;}
	template<class T> ostream& print_iterable_container(ostream& ost, T& container) {
		for (auto&& iter = begin(container); iter != end(container); ++iter) ost << (iter == begin(container) ? " [ " : ", ") << (*iter);
		return ost << " ]";
	}
#	define APPLY_PRINT_ITERABLE_CONTAINER(container_type)\
	template<class T> ostream& operator << (ostream& ost, container_type<T>& container) {\
		return print_iterable_container(ost, container);\
	}
	APPLY_PRINT_ITERABLE_CONTAINER(vector);
	APPLY_PRINT_ITERABLE_CONTAINER(list);
	APPLY_PRINT_ITERABLE_CONTAINER(deque);
}

template<class T> inline bool CHMAX(T &l,const T &r){return l<r?l=r,1:0;}
template<class T> inline bool CHMIN(T &l,const T &r){return l>r?l=r,1:0;}

using ll = long long;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
using vi = vector<int>;
using vll = vector<ll>;
using vvi = vector<vi>;
using vvll = vector<vll>;
using vpii = vector<pii>;
using vpll = vector<pll>;

using ld = long double;

template<class T> using VV = vector<vector<T> >;
template<class T> using maxPQ = priority_queue<T>;
template<class T> using minPQ = priority_queue<T, vector<T>, greater<T> >;
template<class T, class U> using uomap = unordered_map<T, U>;
template<class T> using uoset = unordered_set<T>;

const ll INF = 1001001001;
const ll INFll = (ll)INF * INF;
const ll MOD = 1000000007;
const ll MOD_FFT = 998244353;
const ld EPS = 1e-15;

//function<void(int,int)> tensi_no_3p=[&](int v,int d){
//};

int main() {
	ios_base::sync_with_stdio(false);
	ll N, X; cin >> N >> X;
	vll B(N + 1), L(N + 1), U(N + 1);
	rep(i, N) cin >> B[i] >> L[i] >> U[i];
	// B[N] = 0; L[N] = 0; U[N] = 0; N++;

	ll todo = 0;
	vll zero(N), full(N);
	rep(i, N) {
		todo += zero[i] = ll(B[i]) * L[i];
		full[i] = ll(X - B[i]) * U[i];
	}
	vector<pair<ll, int> > eff(N);
	rep(i, N) {
		eff[i] = mp(zero[i] + full[i], i);
	}
	sort(begin(eff), end(eff), greater<pair<ll, int> >());
	vi order(N);
	rep(i, N) order[eff[i].second] = i;
	
	vll cum(N + 1);
	rep(i, N) cum[i + 1] = cum[i] + eff[i].first;
	
	pr(eff);
	pr(order);

	ll left = -1, right = X * N;
	while (right - left > 1) {
		ll ans = (left + right) / 2;
		bool ok = false;
		rep(i, N) {
			// int ind = lower_bound(begin(eff), end(eff), mp(L[i] * ll(X), INF), greater<pair<ll, int> >()) - begin(eff);
			int ind = ans / X; if (order[i] < ind) ind++;
			ll gain = cum[ind];
			ll tempo = ll(X) * ind;
			if (order[i] < ind) {
				gain -= eff[order[i]].first;
				tempo -= X;
			}
			ll remain = todo - gain;
			ll remtempo = ans - ans / X * X;
			ll remgain = remtempo >= B[i] ? zero[i] + (remtempo - B[i]) * U[i] : remtempo * L[i];
			if (remgain >= remain) {
				ok = true;
				break;
			}
		}
		if (ok) right = ans;
		else left = ans;
	}
	cout << right << endl;
	return 0;
}


Measured memory_bytes: 8960