#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline T qmin(const T a, const T b) {
  return a < b ? a : b;
}
template <typename T>
inline T qmax(const T a, const T b) {
  return a > b ? a : b;
}
template <typename T>
inline void getmin(T &a, const T b) {
  if (a > b) a = b;
}
template <typename T>
inline void getmax(T &a, const T b) {
  if (a < b) a = b;
}
inline void fileio(string s) {
  freopen((s + ".in").c_str(), "r", stdin);
  freopen((s + ".out").c_str(), "w", stdout);
}
const int inf = 1e9;
const long long linf = 1e17 + 7;
const int N = 2e5 + 7;
struct seg {
  int h, l, r;
  seg() {}
  seg(int _h, int _l, int _r) : h(_h), l(_l), r(_r) {}
  bool operator<(const seg &b) const { return h < b.h; }
} a[N];
struct node {
  int l, r, v;
  seg s;
  node() {}
  node(int _l, int _r, int _v, seg _s) : l(_l), r(_r), v(_v), s(_s) {}
  bool operator<(const node &b) const { return l < b.l; }
};
inline int overlap(int l1, int r1, int l2, int r2) {
  return qmax(0, qmin(r1, r2) - qmax(l1, l2));
}
inline bool canget(const seg &a, set<node>::iterator it) {
  set<node>::iterator ul = it, ur = it;
  --ul;
  ++ur;
  seg pre = ul->s, nxt = ur->s, cur = it->s;
  if (pre.h < a.h && pre.h > cur.h && overlap(a.l, a.r, pre.l, pre.r) &&
      overlap(pre.l, pre.r, cur.l, cur.r))
    return false;
  if (nxt.h < a.h && nxt.h > cur.h && overlap(a.l, a.r, nxt.l, nxt.r) &&
      overlap(nxt.l, nxt.r, cur.l, cur.r))
    return false;
  return true;
}
set<node> s;
int n, t;
int main() {
  scanf("%d%d", &n, &t);
  for (int i = 1; i <= n; ++i) scanf("%d%d%d", &a[i].h, &a[i].l, &a[i].r);
  a[++n] = seg(t, -inf, inf);
  sort(a + 1, a + n + 1);
  node bot(-inf, inf, inf << 1, seg(0, -inf, inf));
  node left(-inf - 1, -inf, 0, seg());
  node right(inf, inf + 1, 0, seg());
  s.insert(bot);
  s.insert(left);
  s.insert(right);
  for (int i = 1; i <= n; ++i) {
    set<node>::iterator ul = s.upper_bound(node(a[i].l, a[i].r, 0, seg())), ur;
    int ans = 0;
    for (--ul; ul->r <= a[i].l; ++ul)
      ;
    for (ur = ul; ur->l < a[i].r; ++ur) {
      if (!canget(a[i], ur)) continue;
      getmax(ans, qmin(overlap(a[i].l, a[i].r, ur->l, ur->r), ur->v));
    }
    --ur;
    int l = ul->l, r = ur->r, v1 = ul->v, v2 = ur->v;
    seg s1 = ul->s, s2 = ur->s;
    ++ur;
    s.erase(ul, ur);
    s.insert(node(a[i].l, a[i].r, ans, a[i]));
    if (l < a[i].l) s.insert(node(l, a[i].l, v1, s1));
    if (r > a[i].r) s.insert(node(a[i].r, r, v2, s2));
  }
  set<node>::iterator ite = s.begin();
  ++ite;
  printf("%d\n", ite->v);
  return 0;
}
