#include <bits/stdc++.h>
// #include <ext/pb_ds/assoc_container.hpp>
// #include <ext/pb_ds/tree_policy.hpp>
using namespace std;
// using namespace __gnu_pbds;
using ll = long long;
using bl = bool;
using str = string;
using db = double;
struct qhash
{
static uint64_t splitmix64(uint64_t x)
{
// http://x...content-available-to-author-only...i.it/splitmix64.c
x += 0x9e3779b97f4a7c15;
x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
return x ^ (x >> 31);
}
size_t operator()(uint64_t x) const
{
static const uint64_t FIXED_RANDOM =
chrono::steady_clock::now().time_since_epoch().count();
return splitmix64(x + FIXED_RANDOM);
}
};
#define fi first
#define se second
#define mp(p1, p2) make_pair(p1, p2)
#define f(i, n) for (ll i = 0; i < n; i += 1)
#define fv(i, v) for (typeof(v.begin()) i = v.begin(); i != v.end(); i++)
#define fu(i, start, end) for (int i = start; i < end; i += 1)
#define fd(i, start, end) for (int i = start; i >= end; i -= 1)
#define bit(var, pos) ((var >> pos) & 1)
#define pb push_back
// #define ordered_set tree<pair<ll, ll>, null_type, less<pair<ll, ll>>, rb_tree_tag, tree_order_statistics_node_update>
inline ll power(ll a, ll b)
{
ll res = 1;
while (b)
{
if (b & 1)
res *= a;
a *= a;
b >>= 1;
}
return res;
}
bl shit[200000];
vector<ll>arr[200000];
vector<vector<ll>>v;
ll n;
// const ll maxn=1e5,inf=1e18;
// const ll m1=1e9+7,m2=1e9+9;
// const ll M1=m1*m1,M2=m2*m2;
const int coso = 1000000000;
const int mucoso = 9;
struct bigint {
vector<int> a;
int sign;
int size(){
if(a.empty())return 0;
int ans=(a.size()-1)*mucoso;
int ca=a.back();while(ca)
ans++,ca/=10;
return ans;
}
bigint operator ^(const bigint &v){
bigint ans=1,a=*this,b=v;
while(!b.isZero()){
if(b%2) ans*=a;
a*=a,b/=2;
}
return ans;
}
string to_string(){
stringstream ss;ss << *this;
string s;ss >> s;return s;}
int sumof(){string s = to_string();
int ans = 0;for(auto c : s) ans += c - '0';
return ans;
}
bigint() :sign(1) {}
bigint(long long v) {*this = v;}
bigint(const string &s) {read(s);}
void operator=(const bigint &v) {sign = v.sign;a = v.a;}
void operator=(long long v) {
sign = 1;a.clear();
if (v < 0)sign = -1, v = -v;
for (; v > 0; v = v / coso)a.push_back(v % coso);
}
bigint operator+(const bigint &v) const {
if (sign == v.sign) {
bigint res = v;
for (int i = 0, crr = 0; i < (int) max(a.size(), v.a.size()) || crr; ++i) {
if (i == (int) res.a.size())res.a.push_back(0);
res.a[i] += crr + (i < (int) a.size() ? a[i] : 0);
crr = res.a[i] >= coso;
if (crr)res.a[i] -= coso;
}return res;
}return *this - (-v);
}
bigint operator-(const bigint &v) const {
if (sign == v.sign) {
if (abs() >= v.abs()) {
bigint res = *this;
for (int i = 0, crr = 0; i < (int) v.a.size() || crr; ++i) {
res.a[i] -= crr + (i < (int) v.a.size() ? v.a[i] : 0);
crr = res.a[i] < 0;
if (crr)res.a[i] += coso;
}res.trm();return res;
}return -(v - *this);
}return *this + (-v);
}
void operator*=(int v) {
if (v < 0)
sign = -sign, v = -v;
for (int i = 0, crr = 0; i < (int) a.size() || crr; ++i) {
if (i == (int) a.size())
a.push_back(0);
long long cur = a[i] * (long long) v + crr;
crr = (int) (cur / coso);
a[i] = (int) (cur % coso);
}trm();
}
bigint operator*(int v) const {
bigint res = *this;
res *= v;return res;
}
void operator*=(long long v) {
if (v < 0)
sign = -sign, v = -v;
if(v > coso){
*this = *this * (v / coso) * coso + *this * (v % coso);
return;
}
for (int i = 0, crr = 0; i < (int) a.size() || crr; ++i) {
if (i == (int) a.size())
a.push_back(0);
long long cur = a[i] * (long long) v + crr;
crr = (int) (cur / coso);
a[i] = (int) (cur % coso);
}
trm();
}
bigint operator*(long long v) const {
bigint res = *this;
res *= v;return res;
}
friend pair<bigint, bigint> divmod(const bigint &a1, const bigint &b1) {
int norm = coso / (b1.a.back() + 1);
bigint a = a1.abs() * norm;
bigint b = b1.abs() * norm;
bigint q, r;
q.a.resize(a.a.size());
for (int i = a.a.size() - 1; i >= 0; i--) {
r *= coso;r += a.a[i];
int s1 = r.a.size() <= b.a.size() ? 0 : r.a[b.a.size()];
int s2 = r.a.size() <= b.a.size() - 1 ? 0 : r.a[b.a.size() - 1];
int d = ((long long) coso * s1 + s2) / b.a.back();
r -= b * d;
while (r < 0)
r += b, --d;
q.a[i] = d;
}
q.sign = a1.sign * b1.sign;
r.sign = a1.sign;
q.trm();r.trm();
return make_pair(q, r / norm);
}
bigint operator/(const bigint &v) const {return divmod(*this, v).fi;}
bigint operator%(const bigint &v) const {return divmod(*this, v).se;}
void operator/=(int v) {
if (v < 0)
sign = -sign, v = -v;
for (int i = (int) a.size() - 1, rem = 0; i >= 0; --i) {
long long cur = a[i] + rem * (long long) coso;
a[i] = (int) (cur / v);
rem = (int) (cur % v);
} trm();
}
bigint operator/(int v) const {
bigint res = *this;
res /= v;return res;
}
int operator%(int v) const {
if (v < 0) v = -v;
int m = 0;
for (int i = a.size() - 1; i >= 0; --i)
m = (a[i] + m * (long long) coso) % v;
return m * sign;
}
void operator+=(const bigint &v) {*this = *this + v;}
void operator-=(const bigint &v) {*this = *this - v;}
void operator*=(const bigint &v) {*this = *this * v;}
void operator/=(const bigint &v) {*this = *this / v;}
bool operator<(const bigint &v) const {
if (sign != v.sign) return sign < v.sign;
if (a.size() != v.a.size()) return a.size() * sign < v.a.size() * v.sign;
for (int i = a.size() - 1; i >= 0; i--)
if (a[i] != v.a[i]) return a[i] * sign < v.a[i] * sign;
return false;
}
bool operator>(const bigint &v) const {return v < *this;}
bool operator<=(const bigint &v) const {return !(v < *this);}
bool operator>=(const bigint &v) const {return !(*this < v);}
bool operator==(const bigint &v) const {return !(*this < v) && !(v < *this);}
bool operator!=(const bigint &v) const {return *this < v || v < *this;}
void trm() {while (!a.empty() && !a.back())a.pop_back();if (a.empty())sign = 1;}
bool isZero() const { return a.empty() || (a.size() == 1 && !a[0]); }
bigint operator-() const {
bigint res = *this;
res.sign = -sign;
return res;
}
bigint abs() const {
bigint res = *this;
res.sign *= res.sign;
return res;
}
long long longValue() const {
long long res = 0;
for (int i = a.size() - 1; i >= 0; i--)
res = res * coso + a[i];
return res * sign;
}
void read(const string &s) {
sign = 1;a.clear();int pos = 0;
while (pos < (int) s.size() && (s[pos] == '-' || s[pos] == '+')) {
if (s[pos] == '-')
sign = -sign;++pos;
}
for (int i = s.size() - 1; i >= pos; i -= mucoso) {
int x = 0;
for (int j = max(pos, i - mucoso + 1); j <= i; j++)
x = x * 10 + s[j] - '0';a.push_back(x);
} trm();
}
friend istream& operator>>(istream &stream, bigint &v) {
string s;stream >> s;v.read(s);return stream;
}
friend ostream& operator<<(ostream &stream, const bigint &v) {
if (v.sign == -1) stream << '-';
stream << (v.a.empty() ? 0 : v.a.back());
for (int i = (int) v.a.size() - 2; i >= 0; --i)
stream << setw(mucoso) << setfill('0') << v.a[i];
return stream;
}
static vector<int> cv_b(const vector<int> &a, int oldd, int newd) {
vector<long long> p(max(oldd, newd) + 1);p[0] = 1;
for (int i = 1; i < (int) p.size(); i++) p[i] = p[i - 1] * 10;
vector<int> res;
long long cur = 0;
int cur_digits = 0;
for (int i = 0; i < (int) a.size(); i++) {
cur += a[i] * p[cur_digits];
cur_digits += oldd;
while (cur_digits >= newd) {
res.push_back(int(cur % p[newd]));
cur /= p[newd];
cur_digits -= newd;
}
}
res.push_back((int) cur);
while (!res.empty() && !res.back())
res.pop_back();
return res;
}
typedef vector<long long> vll;
static vll mul(const vll &a, const vll &b) {
int n = a.size();
vll res(n + n);
if (n <= 32) {
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
res[i + j] += a[i] * b[j];
return res;
}
int k = n >> 1;
vll a1(a.begin(), a.begin() + k);
vll a2(a.begin() + k, a.end());
vll b1(b.begin(), b.begin() + k);
vll b2(b.begin() + k, b.end());
vll a1b1 = mul(a1, b1);
vll a2b2 = mul(a2, b2);
for (int i = 0; i < k; i++) a2[i] += a1[i];
for (int i = 0; i < k; i++) b2[i] += b1[i];
vll r = mul(a2, b2);
for (int i = 0; i < (int) a1b1.size(); i++)
r[i] -= a1b1[i];
for (int i = 0; i < (int) a2b2.size(); i++)
r[i] -= a2b2[i];
for (int i = 0; i < (int) r.size(); i++)
res[i + k] += r[i];
for (int i = 0; i < (int) a1b1.size(); i++)
res[i] += a1b1[i];
for (int i = 0; i < (int) a2b2.size(); i++)
res[i + n] += a2b2[i];
return res;
}
bigint operator*(const bigint &v) const {
vector<int> a6 = cv_b(this->a, mucoso, 6);
vector<int> b6 = cv_b(v.a, mucoso, 6);
vll a(a6.begin(), a6.end());
vll b(b6.begin(), b6.end());while (a.size() < b.size()) a.push_back(0);
while (b.size() < a.size()) b.push_back(0);while (a.size() & (a.size() - 1))
a.push_back(0),b.push_back(0);
vll c = mul(a, b);
bigint res;
res.sign = sign * v.sign;
for (int i = 0, crr = 0; i < (int) c.size(); i++) {
long long cur = c[i] + crr;
res.a.push_back((int) (cur % 1000000));
crr = (int) (cur / 1000000);
}
res.a = cv_b(res.a, 6, mucoso);
res.trm();
return res;
}
};
// // a - (b * c)
// ll comp(ll &a, ll b, ll c) {
// ll val = b * c;
// if (b != 0 && val / b != c) {
// return 0;
// }
// else
// }
bl check(bigint core) {
vector<vector<ll>>ev;
fill(shit, shit + n, 0);
f(i, n) {
ev.push_back({v[i][0], 0, i});
ev.push_back({v[i][1], 1, i});
}
sort(ev.begin(), ev.end());
bigint need = 0;
bigint prv = -1;
bigint cnt = 0;
vector<ll>cur;
f(i, ev.size()) {
ll idx = ev[i][2];
bigint loc = ev[i][0];
bigint type = ev[i][1];
// cout << idx << " " << loc << " " << type << '\n';
if (type == 0) {
// ne
need -= (loc - 1 - prv) * core;
if (need < 0) {
cnt = 0;
for (auto &val : cur)
shit[val] = 1;
cur.clear();
}
need = max(need, bigint(0));
prv = loc - 1;
cnt += v[idx][2];
need += v[idx][2];
cur.push_back(idx);
}
else {
if (shit[idx]) continue;
need -= (loc - prv) * core;
prv = loc;
if (cnt - need < v[idx][2]) return 0;
cnt -= v[idx][2];
}
// cout << need << " " << prv << " " << cnt << "\n";
}
return 1;
}
void solve() {
ll tras;
cin >> n >> tras;
f(i, n) {
ll a, b, c;
cin >> a >> b >> c;
v.push_back({b, c, a});
}
sort(v.begin(), v.end());
ll l = 0, r = 1e17 + 1;
while (r - l > 1) {
ll mid = l + (r - l) / 2;
if (check(mid)) r = mid;
else l = mid;
}
cout << r;
}
int main()
{
freopen("schedule.INP", "r" ,stdin); freopen("schedule.OUT", "w", stdout);
std::ios_base::sync_with_stdio(0);
std::cin.tie(nullptr);
long long test = 1;
// cin >> test;
for (int i = 0; i < test; i += 1)
{
solve();
}
return 0;
}