#include <bits/stdc++.h>
using namespace std;
template <class T>
inline void umax(T &a, T b) {
  if (a < b) a = b;
}
template <class T>
inline void umin(T &a, T b) {
  if (a > b) a = b;
}
template <class T>
inline T abs(T a) {
  return a > 0 ? a : -a;
}
const int inf = 1e9 + 143;
const long long longinf = 1e18 + 143;
inline int read() {
  int x;
  scanf(" %d", &x);
  return x;
}
const int N = 1 << 18;
pair<int, pair<int, int> > a[N];
int l[N], r[N];
vector<int> g[N];
int f[N];
int T[N << 1];
int lazy[N << 1];
bool exist[N << 1];
void init() {
  for (int i = 0; i < N + N; i++) {
    T[i] = -inf;
    exist[i] = false;
  }
}
void push(int x) {
  if (exist[x]) {
    exist[x + x] = exist[x + x + 1] = true;
    lazy[x + x] = lazy[x + x + 1] = lazy[x];
    exist[x] = false;
  }
}
void relax(int x) {
  int L = x + x, R = x + x + 1;
  T[x] = max(exist[L] ? lazy[L] : T[L], exist[R] ? lazy[R] : T[R]);
}
void tset(int x, int l, int r, int x1, int x2, int val) {
  if (l > x2 || r < x1) return;
  if (l >= x1 && r <= x2) {
    exist[x] = true;
    lazy[x] = val;
    return;
  }
  push(x);
  int m = (l + r) >> 1;
  tset(x + x, l, m, x1, x2, val);
  tset(x + x + 1, m + 1, r, x1, x2, val);
  relax(x);
}
int tget(int x, int l, int r, int x1, int x2) {
  if (l > x2 || r < x1) return -inf;
  if (l >= x1 && r <= x2) return exist[x] ? lazy[x] : T[x];
  push(x);
  int m = (l + r) >> 1;
  int tmp0 = tget(x + x, l, m, x1, x2);
  int tmp1 = tget(x + x + 1, m + 1, r, x1, x2);
  relax(x);
  return max(tmp0, tmp1);
}
bool good(int up, int down, int haveto) {
  int lo = max(l[up], l[down]);
  int hi = min(r[up], r[down]);
  return tget(1, 0, N - 1, lo, hi) == haveto;
}
int main() {
  int n = read();
  int t = read();
  vector<int> xs;
  for (int i = 0; i < n; i++) {
    int h = read();
    int l = read();
    int r = read() - 1;
    xs.push_back(l);
    xs.push_back(r);
    a[i] = make_pair(h, pair<int, int>(l, r));
  }
  xs.push_back(-inf);
  xs.push_back(+inf);
  a[n++] = make_pair(0, pair<int, int>(-inf, +inf));
  a[n++] = make_pair(t, pair<int, int>(-inf, +inf));
  sort((xs).begin(), (xs).end());
  xs.erase(unique((xs).begin(), (xs).end()), xs.end());
  sort(a, a + n);
  for (int i = 0; i < n; i++) {
    l[i] =
        lower_bound((xs).begin(), (xs).end(), a[i].second.first) - xs.begin();
    r[i] =
        lower_bound((xs).begin(), (xs).end(), a[i].second.second) - xs.begin();
  }
  init();
  for (int i = 0; i < n; i++) {
    int cand = tget(1, 0, N - 1, l[i], l[i]);
    if (cand > -inf && good(i, cand, cand)) {
      g[i].push_back(cand);
    }
    cand = tget(1, 0, N - 1, r[i], r[i]);
    if (cand > -inf && good(i, cand, cand)) {
      g[i].push_back(cand);
    }
    tset(1, 0, N - 1, l[i], r[i], i);
  }
  init();
  for (int i = n - 1; i >= 0; i--) {
    int cand = tget(1, 0, N - 1, l[i], l[i]);
    if (cand > -inf) cand = -cand;
    if (cand > -inf && good(cand, i, -cand)) {
      g[cand].push_back(i);
    }
    cand = tget(1, 0, N - 1, r[i], r[i]);
    if (cand > -inf && good(cand, i, -cand)) {
      g[cand].push_back(i);
    }
    tset(1, 0, N - 1, l[i], r[i], -i);
  }
  memset(f, -1, sizeof f);
  f[0] = 2 * inf;
  for (int i = 0; i < n; i++) {
    for (__typeof((g[i]).begin()) it = (g[i]).begin(); it != (g[i]).end();
         it++) {
      int p = *it;
      0;
      int inter = min(a[i].second.second, a[p].second.second) -
                  max(a[i].second.first, a[p].second.first) + 1;
      0;
      if (f[p] != -1) umax(f[i], min(f[p], inter));
    }
    0;
  }
  printf("%d\n", f[n - 1]);
  return 0;
}
