#include <iostream>
#include <iomanip>
#include <random>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <cmath>
#include <numeric>
#include <cstdlib>
#include <cstring>
#include <deque>
#include <sstream>
#include <bitset>
#include <cassert>
#include <fstream>
#include <queue>

#define len(X) ((int)(X).size())

#ifdef __LOCAL
	#define DBG(X) cout << "[DBG] " << #X << "=" << (X) << '\n';
	#define SAY(X) cout << "[SAY] " << (X) << '\n';
#else
	#define DBG(X)
	#define SAY(X)
#endif
 
using namespace std;

using ll = long long int;
using ull = unsigned long long int;
using ld  = long double;
using pii = pair<int, int>;
using pll = pair<ll, ll>;

const int INT_INF = (int)(2e9);
const ll  LL_INF  = (ll)(2e18);

const int NIL = -1;
static mt19937 _g(time(nullptr));

inline ll randint(ll a, ll b) { ll w = (_g() << 31LL) ^ _g(); return a + w % (b - a + 1); }
inline void fast_io() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); };
template<typename T> inline T sign(T x) { return T(x > 0) - T(x < 0); }
template<typename T, typename S> inline ostream& operator<<(ostream& os, const pair<T, S> p) { cout << "[" << p.first << ";" << p.second << "]"; return os; }
template<typename T> inline ostream& operator<<(ostream& os, const vector<T>& v) { for(auto el: v) cout << el << " "; return os; }
template<typename T> inline T fetch() { T ret; cin >> ret; return ret; }
template<typename T> inline vector<T> fetch_vec(int sz) { vector<T> ret(sz); for(auto& elem: ret) cin >> elem; return ret; }

struct Data {
	ll b, l, r;
	int used = 0;
};

const int MAXN = (int)1e5 + 7;
Data a[MAXN];
int n;
ll X;

struct SortFulls {
	bool operator()(const Data& lhs, const Data& rhs) const {
		ll left = (X - lhs.b) * lhs.r - (0 - lhs.b) * lhs.l;
		ll right = (X - rhs.b) * rhs.r - (0 - rhs.b) * rhs.l;
		return left > right;
	}
};

int check(ll days) {
	for(int i = 0; i < n; ++i) a[i].used = 0;
	ll fulls = days / X;
	ll rem  = days % X;
	DBG(fulls); DBG(rem);
	ll cur = 0;
	for(int i = 0; i < n; ++i) {
		cur += (0 - a[i].b) * a[i].l;
	}
	sort(a, a + n, SortFulls());
	int last = NIL;
	for(int i = 0; i < n; ++i) {
		ll change = (X - a[i].b) * a[i].r - (0 - a[i].b) * a[i].l;
		if(change > 0 && fulls > 0) {
			cur += change;
			--fulls;
			a[i].used = 1;
			last = i;
		}
	}
	ll mx = 0;
	for(int i = 0; i < n; ++i) {
		if(a[i].used) {
			ll change = (rem - a[i].b) * a[i].r - (0 - a[i].b) * a[i].l;
			change -= (X - a[i].b) * a[i].r - (0 - a[i].b) * a[i].l;
			if(last + 1 < n) {
				change += max(0LL, (X - a[last + 1].b) * a[last + 1].r - (0 - a[last + 1].b) * a[last + 1].l);
			}

			mx = max(mx, change);
		} else {
			ll change = (rem - a[i].b) * a[i].r - (0 - a[i].b) * a[i].l;
			mx = max(mx, change);
		}
	}
	
	for(int i = 0; i < n; ++i) {
		if(a[i].used) {
			ll change = (rem - a[i].b) * a[i].l - (0 - a[i].b) * a[i].l;
			change -= (X - a[i].b) * a[i].r - (0 - a[i].b) * a[i].l;
			if(last + 1 < n) {
				change += max(0LL, (X - a[last + 1].b) * a[last + 1].r - (0 - a[last + 1].b) * a[last + 1].l);
			}

			mx = max(mx, change);
		} else {
			ll change = (rem - a[i].b) * a[i].l - (0 - a[i].b) * a[i].l;
			mx = max(mx, change);
		}
	}

	cur += mx;
	return cur >= 0;
}

void solve() {
	cin >> n >> X;
	for(int i = 0; i < n; ++i) {
		cin >> a[i].b >> a[i].l >> a[i].r;
	}

	ll low = 0, high = X * n;
	if(check(low)) {
		cout << low << '\n';
	} else {
		while(high - low > 1) {
			ll mid = (low + high) / 2;
			if(check(mid)) {
				high = mid;
			} else {
				low = mid;
			}
		}
		cout << high << '\n';
	}
}

int main() {
	fast_io();
	solve();

	return 0;
}


Measured memory_bytes: 3456