#include <bits/stdc++.h>
using namespace std;
inline int read() {
  int ret = 0, p = 1;
  char ch = getchar();
  for (; !isdigit(ch); ch = getchar())
    if (ch == '-') p = -1;
  for (; isdigit(ch); ch = getchar()) ret = ret * 10 + ch - '0';
  return ret * p;
}
struct Board {
  int h, l, r;
} fall[500000 + 3];
inline bool cmp(Board a, Board b) { return a.h > b.h; }
int a[500000 + 3], s[500000 + 3], f[500000 + 3];
struct Tree {
  int l, r, v, s;
} tree[500000 * 4 + 3];
int n, m;
void build(int x, int l, int r) {
  tree[x].l = l;
  tree[x].r = r;
  tree[x].v = -1;
  tree[x].s = -1;
  if (l == r) return;
  int mid = (l + r) >> 1;
  build(x * 2, l, mid);
  build(x * 2 + 1, mid + 1, r);
}
void up(int now, int x, int l, int r) {
  if (tree[x].l == l && tree[x].r == r) {
    tree[x].v = now;
    tree[x].s = now;
    return;
  }
  if (tree[x].s != -1) {
    tree[x * 2].s = tree[x].s;
    tree[x * 2].v = tree[x].s;
    tree[x * 2 + 1].s = tree[x].s;
    tree[x * 2 + 1].v = tree[x].s;
    tree[x].s = -1;
  }
  int mid = (tree[x].l + tree[x].r) >> 1;
  if (r <= mid)
    up(now, x * 2, l, r);
  else if (l > mid)
    up(now, x * 2 + 1, l, r);
  else
    up(now, x * 2, l, mid), up(now, x * 2 + 1, mid + 1, r);
  tree[x].v = max(tree[x * 2].v, tree[x * 2 + 1].v);
}
int find(int x, int l, int r) {
  if (tree[x].l == l && tree[x].r == r) return tree[x].v;
  if (tree[x].s != -1) {
    tree[x * 2].s = tree[x].s;
    tree[x * 2].v = tree[x].s;
    tree[x * 2 + 1].s = tree[x].s;
    tree[x * 2 + 1].v = tree[x].s;
    tree[x].s = -1;
  }
  int mid = (tree[x].l + tree[x].r) >> 1;
  if (r <= mid)
    return find(x * 2, l, r);
  else if (l > mid)
    return find(x * 2 + 1, l, r);
  else
    return max(find(x * 2, l, mid), find(x * 2 + 1, mid + 1, r));
}
void done(int now, int l, int r, int L, int R) {
  if (l > r) return;
  int tmp = find(1, l, r);
  if (tmp == -1) {
    up(now, 1, l, r);
    f[now] = a[r + 1] - a[l];
    return;
  }
  int ll = fall[tmp].l, rr = fall[tmp].r;
  if ((ll >= l || L > 0) && (rr <= r || R > 0)) {
    f[now] = max(f[now], min(f[tmp], a[min(rr, r) + 1] - a[max(ll, l)]));
  }
  if (l < ll) done(now, l, ll - 1, L, 0);
  if (r > rr) done(now, rr + 1, r, 0, R);
}
int main() {
  n = read();
  m = read();
  for (int i = 1; i <= n; i++) {
    fall[i].h = read();
    fall[i].l = read();
    fall[i].r = read();
    s[i * 2 - 1] = fall[i].l;
    s[i * 2] = fall[i].r;
  }
  s[n * 2 + 1] = -1000000000;
  s[n * 2 + 2] = 1000000000;
  sort(s + 1, s + n * 2 + 2 + 1);
  a[0] = 1;
  a[1] = s[1];
  for (int i = 2; i <= n * 2 + 2; i++) {
    if (s[i] != s[i - 1]) {
      a[0]++;
      a[a[0]] = s[i];
    }
  }
  fall[n + 1].h = m;
  fall[n + 1].l = -1000000000;
  fall[n + 1].r = 1000000000;
  fall[n + 2].h = 0;
  fall[n + 2].l = -1000000000;
  fall[n + 2].r = 1000000000;
  n += 2;
  for (int i = 1; i <= n; i++) {
    int l = 1, r = a[0], mid;
    while (1) {
      mid = (l + r) >> 1;
      if (a[mid] == fall[i].l) break;
      if (a[mid] > fall[i].l)
        r = mid - 1;
      else
        l = mid + 1;
    }
    fall[i].l = mid;
    l = 1;
    r = a[0];
    while (1) {
      mid = (l + r) >> 1;
      if (a[mid] == fall[i].r) break;
      if (a[mid] > fall[i].r)
        r = mid - 1;
      else
        l = mid + 1;
    }
    fall[i].r = mid - 1;
  }
  sort(fall + 1, fall + n + 1, cmp);
  memset(f, 0, sizeof(f));
  build(1, 1, a[0]);
  for (int i = 1; i <= n; i++) {
    done(i, fall[i].l, fall[i].r, 1, 1);
    up(i, 1, fall[i].l, fall[i].r);
  }
  printf("%d\n", f[n]);
  return 0;
}
