#include <bits/stdc++.h>
using namespace std;
const int N = (int)1e5 + 2;
const int INF = (int)1e9;
struct panel {
  int l, r, h;
  panel() {}
  panel(int l, int r, int h) {
    panel ::l = l;
    panel ::r = r;
    panel ::h = h;
  }
};
bool comp(panel a, panel b) { return a.h > b.h; }
struct node {
  int second, l, r, num;
  node *L, *R;
  void init() {
    L = R = NULL;
    l = r = 0;
    second = rand();
  }
  node() { init(); }
  node(int l, int r, int num) {
    init();
    node ::l = l;
    node ::r = r;
    node ::num = num;
  }
};
void splitL(node *v, int first, node *&l, node *&r) {
  if (v == NULL) {
    l = r = NULL;
    return;
  }
  if (v->r <= first) {
    l = v;
    splitL(v->R, first, l->R, r);
  } else {
    r = v;
    splitL(v->L, first, l, r->L);
  }
}
void splitR(node *v, int first, node *&l, node *&r) {
  if (v == NULL) {
    l = r = NULL;
    return;
  }
  if (v->l < first) {
    l = v;
    splitR(v->R, first, v->R, r);
  } else {
    r = v;
    splitR(v->L, first, l, v->L);
  }
}
void merge(node *l, node *r, node *&v) {
  if (l == NULL) {
    v = r;
    return;
  } else if (r == NULL) {
    v = l;
    return;
  }
  if (l->second <= r->second) {
    v = l;
    merge(v->R, r, v->R);
  } else {
    v = r;
    merge(l, v->L, v->L);
  }
}
int n, t, ans[N];
node *root;
panel a[N];
vector<node *> cur;
void add(node *&v, int l, int r, int num) { merge(v, new node(l, r, num), v); }
int intersecLen(int v1, int v2) {
  return max(0, min(a[v1].r, a[v2].r) - max(a[v1].l, a[v2].l));
}
bool test(int v1, int v2) { return a[v1].h > a[v2].h && intersecLen(v1, v2); }
void dfs(node *v) {
  if (v == NULL) return;
  dfs(v->L);
  cur.push_back(v);
  dfs(v->R);
}
void logTree(node *v) {
  if (v) {
    logTree(v->L);
    fprintf(stderr, "([%d, %d], num = %d) ", v->l, v->r, v->num);
    logTree(v->R);
  }
}
void solve(int num) {
  node *l, *m, *r;
  splitL(root, a[num].l, l, m);
  splitR(m, a[num].r, m, r);
  cur.clear();
  dfs(m);
  for (int i = 0; i < (int)(cur).size(); i++) {
    int v = cur[i]->num;
    bool flag = false;
    if (i) flag = flag || test(v, cur[i - 1]->num);
    if (i < (int)(cur).size() - 1) flag = flag || test(v, cur[i + 1]->num);
    if (!flag) {
      int interLen =
          max(0, min(cur[i]->r, a[num].r) - max(cur[i]->l, a[num].l));
      ans[num] = max(ans[num], min(ans[v], interLen));
    }
  }
  if ((int)(cur).size()) {
    if (cur[0]->l < a[num].l) add(l, cur[0]->l, a[num].l, cur[0]->num);
  }
  add(l, a[num].l, a[num].r, num);
  if ((int)(cur).size()) {
    if (cur.back()->r > a[num].r)
      add(l, a[num].r, cur.back()->r, cur.back()->num);
  }
  merge(l, r, root);
}
int main() {
  srand(time(NULL));
  scanf("%d%d", &n, &t);
  for (int i = 0; i < n; i++) scanf("%d%d%d", &a[i].h, &a[i].l, &a[i].r);
  a[n++] = panel(-INF, INF, t);
  a[n++] = panel(-INF, INF, 0);
  sort(a, a + n, comp);
  ans[0] = a[0].r - a[0].l;
  add(root, a[0].l, a[0].r, 0);
  for (int i = 1; i < n; i++) {
    solve(i);
  }
  cout << ans[n - 1] << endl;
  return 0;
}
