#include <bits/stdc++.h>
using namespace std;
struct panel {
  int h, l, r;
  panel() {}
  panel(int _h, int _l, int _r) { h = _h, l = _l, r = _r; }
} p[100010];
bool comp(panel a, panel b) { return a.h < b.h; }
bool operator<(panel a, panel b) { return a.l < b.l; }
set<panel> swl;
vector<panel> r;
void check(panel a, panel b, int& fl) {
  if (a.h < b.h && max(a.l, b.l) < min(a.r, b.r)) fl = 0;
}
int flw(panel a, panel b) { return min(a.r, b.r) - max(a.l, b.l); }
int n, t, dp[100010], fl[100010];
int main() {
  scanf("%d%d", &n, &t);
  n += 2;
  p[0].h = t;
  p[0].l = -1000000000;
  p[0].r = 1000000000;
  for (int i = 1; i < n - 1; i++) scanf("%d%d%d", &p[i].h, &p[i].l, &p[i].r);
  p[n - 1].h = 0;
  p[n - 1].l = -1000000000;
  p[n - 1].r = 1000000000;
  sort(p, p + n, comp);
  dp[0] = 1000000000 * 2;
  fill(fl, fl + n, 1);
  for (int i = 0; i < n; i++) {
    r.clear();
    set<panel>::iterator x = swl.upper_bound(p[i]);
    if (x != swl.begin()) x--;
    for (set<panel>::iterator it = x; it != swl.end(); it++) {
      if (p[i].r <= it->l) break;
      r.push_back(*it);
    }
    int m = r.size();
    for (int j = 0; j < m; j++) {
      if (j != 0) check(p[r[j].h], p[r[j - 1].h], fl[r[j].h]);
      if (j != ((int)(r).size()) - 1)
        check(p[r[j].h], p[r[j + 1].h], fl[r[j].h]);
    }
    for (int j = 0; j < m; j++) {
      if (fl[r[j].h]) dp[i] = max(dp[i], min(dp[r[j].h], flw(p[i], r[j])));
      swl.erase(r[j]);
    }
    for (int j = 0; j < m; j++) fl[r[j].h] = 1;
    if (m) {
      if (r[0].l != p[i].l) swl.insert(panel(r[0].h, r[0].l, p[i].l));
      if (r[m - 1].r != p[i].r)
        swl.insert(panel(r[m - 1].h, p[i].r, r[m - 1].r));
    }
    swl.insert(panel(i, p[i].l, p[i].r));
  }
  printf("%d\n", dp[n - 1]);
}
