// AtCoder-Template.cpp : このファイルには 'main' 関数が含まれています。プログラム実行の開始と終了がそこで行われます。
//

#include <iostream>
#include <algorithm>
#include <bitset>
#include <cassert>
#include <cctype>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <deque>
#include <fstream>
#include <functional>
#include <iostream>
#include <limits>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <vector>
using namespace std;
using ll = long long;
#define fst first
#define snd second
#define FOR(i,N) for(auto i=0; i<N; ++i)
#define FORREV(i,N,_cnt) for(auto i=N-1,cnt=_cnt; cnt > 0; --i, --cnt)
#define ALL(x) x.begin(), x.end()

/* clang-format off */
template <class T, size_t D> struct _vec { using type = vector<typename _vec<T, D - 1>::type>; };
template <class T> struct _vec<T, 0> { using type = T; };
template <class T, size_t D> using vec = typename _vec<T, D>::type;
template <class T> vector<T> make_v(size_t size, const T& init) { return vector<T>(size, init); }
template <class... Ts> auto make_v(size_t size, Ts... rest) { return vector<decltype(make_v(rest...))>(size, make_v(rest...)); }
template <class T> inline void chmin(T& a, const T& b) { if (b < a) a = b; }
template <class T> inline void chmax(T& a, const T& b) { if (b > a) a = b; }
/* clang-format on */

int main() {
#ifdef DEBUG
	ifstream ifs("in.txt");
	cin.rdbuf(ifs.rdbuf());
#endif
	ll N, X;
	cin >> N >> X;
	//vector<tuple<ll, ll, ll> > T;
	vector<ll> Bi;
	vector<ll> Li;
	vector<ll> Ui;
	vector<ll> T_sums;

	ll init_score = 0; // この得点は、最初 Σ -Li Bi になる
	ll sum_bi = 0;
	FOR(i, N) {
		ll b, l, u;
		cin >> b >> l >> u;
		Bi.push_back(b); Li.push_back(l); Ui.push_back(u);
		init_score -= b * l;
		sum_bi += b;

		T_sums.push_back(b * l + (X - b) * u);
	}
	
	vector<ll> Li_large_index(N);
	iota(ALL(Li_large_index), 0);
	sort(ALL(Li_large_index), [&](auto a, auto b) {  return T_sums[a] > T_sums[b];  });
	// Li が大きい順に並べる。


	// Tsumの累積和
	vector<ll> T_sum_accumulate(N, 0);
	T_sum_accumulate[0] = T_sums[Li_large_index[0]];
	FOR(i, N - 1)
	{
		auto Lii = Li_large_index[i+1];
		T_sum_accumulate[i + 1] = T_sum_accumulate[i] + T_sums[Lii];
	}


	auto check_kCounts_pickup = [&](auto k) {
		// k個で、init_score が越せるか
		ll q = k / X; // q個、大きい方からとる
		ll r = k - X * q; // r 個取る。
		if (q >= N) return true;
		bool ok = false;
		FOR(_i, N) {
			auto i = N - 1 - _i;
			// これ、r個取るものの選び方。
			ll tmp_init_score = init_score;
			if ( q-1 >= 0) tmp_init_score += T_sum_accumulate[q-1]; // まずq個　
			// qが3の時、rが0,1,2 ならrが含まれてしまっているので飛ばす。
			if (i + 1 <= q) {
				tmp_init_score -= T_sums[Li_large_index[i]];
				tmp_init_score += T_sums[Li_large_index[q]];
			}

			// r個を足す
			if (r > 0) {
				auto Lii = Li_large_index[i];
				if (r >= Bi[Lii]) {
					tmp_init_score += (r - Bi[Lii]) * Ui[Lii];
					tmp_init_score += Bi[Lii] * Li[Lii];
				} else {
					tmp_init_score += r * Li[Lii];
				}
			}
			
			if (tmp_init_score >= 0) 
			{
				ok = true; break;
			}
		} // break

		// c_init_scoreが0を超えたら、勝ち。
		//if (init_score >= 0) return true;
		if (ok) return true;
		return false;
		
	};
	
	ll ok = N*sum_bi;
	ll ng = 0;
	ll mid = (ok + ng) / 2;
	while (abs(ok - ng) > 1) {
		if (check_kCounts_pickup(mid)) {
			ok = mid;
		}
		else ng = mid;
		mid = (ok + ng) / 2;
	}
	cout << ok << endl;


	return 0;
}


Measured memory_bytes: 5076