//~ while (clock()<=69*CLOCKS_PER_SEC)
//~ #pragma comment(linker, "/stack:200000000")
//~ #pragma GCC optimize("O3")
//~ #pragma GCC optimize("Ofast")
//~ #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
//~ #pragma GCC optimize("unroll-loops")
#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

#define pb push_back
#define SZ(x) ((int)(x).size())
#define ALL(x) x.begin(),x.end()
#define all(x) x.begin(),x.end()
#define fi first
#define se second
#define _upgrade ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define erase_duplicates(x) sort(all(x)); (x).resize(distance((x).begin(), unique(all(x))));


using namespace std;
using namespace __gnu_pbds;
template<typename T>
using ordered_set = tree<
T,
null_type,
less<T>,
rb_tree_tag,
tree_order_statistics_node_update>;

//X.find_by_order(k); - zwraca iterator na k-ty element (numeracja od zerowego)
//X.order_of_key(k); - zwraca liczbę elementów ostro mniejszych niż k

typedef long long LL;
typedef pair<int,int> PII;
typedef pair<LL,LL> PLL;
typedef vector<PII> VPII;
typedef vector<PLL> VPLL;
typedef vector<LL> VLL;
typedef vector<int> VI;
typedef vector<string> VS;
typedef vector<char> VC;
typedef long double LD;
typedef pair<LD,LD> PLD;
typedef vector<LD> VLD;
typedef vector<PLD> VPLD;

template<class TH> void _dbg(const char *sdbg, TH h){ cerr<<sdbg<<" = "<<h<<endl; }
template<class TH, class... TA> void _dbg(const char *sdbg, TH h, TA... a) {
  while(*sdbg!=',')cerr<<*sdbg++;
  cerr<<" = "<<h<<", "; _dbg(sdbg+1, a...);
}

#ifdef LOCAL
#define dbg(...) _dbg(#__VA_ARGS__, __VA_ARGS__)
#else
#define dbg(...)
#define cerr if(0)cout
#endif

const int maxn = (1e6)+7;
const int maxk = 20;
const int inf = (1e9)+7;
const LL LLinf = ((LL)1e18)+7LL;
const LD eps = 1e-9;
const LL mod = 1e9+7;

// ***************************** CODE ***************************** //

LL b[maxn], l[maxn], r[maxn];
LL n, x;
VI V;
bool vis[maxn];

bool op(int i, int j)
{
  return r[i] * (x - b[i]) + l[i] * b[i] > r[j] * (x - b[j]) + l[j] * b[j];
}

LL val(int i, LL pos)
{
  if(pos <= b[i])
    return l[i] * pos;
  return r[i] * (pos - b[i]) + l[i] * b[i];
}

LL value(LL a)
{
  LL cale = a / x;
  LL male = a % x;
  LL res = 0LL;
  for(int i = 0;i <= n;i++)
    vis[i] = 0;
  for(int i = 0;i < min(n, cale);i++)
  {
    res += val(V[i], x);
    vis[V[i]] = 1;
  }
  if(cale >= n)
    return res;
  LL nast = 0LL;
  if(cale < n)
    nast = val(V[cale], x);
  LL xd = res;
  for(int i = 1;i <= n;i++)
  {
    LL cur = res;
    if(vis[i])
      cur += -val(i, x) + nast;
    cur += val(i, male);
    xd = max(xd, cur);
  }
  return xd;
}

LL res;

int main()
{
	_upgrade
  cin>>n>>x;
  // n = x = 1e5;
  for(int i = 1;i <= n;i++)
  {
    V.pb(i);
    // b[i] = l[i] = r[i] = 1e5;
    // l[i] = 1;
    // r[i] = 2;
    // b[i] = 3;
    cin>>b[i]>>l[i]>>r[i];
    res += -b[i] * l[i];
  }
  sort(all(V), op);
  LL ll = -1;
  LL pp = n * x + 1;
  while(ll + 1 < pp)
  {
    LL sr = (ll + pp) / 2LL;
    // dbg(ll, sr, pp);
    if(value(sr) + res >= 0LL)
      pp = sr;
    else
      ll = sr;
  }
  // dbg(value(6103514));
  cout<<pp;
	return 0;
}


Measured memory_bytes: 5752