#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:200000000")
using namespace std;
template <typename T>
inline T Abs(T x) {
  return (x >= 0) ? x : -x;
}
template <typename T>
inline T sqr(T x) {
  return x * x;
}
template <typename T>
string toStr(T x) {
  stringstream st;
  st << x;
  string s;
  st >> s;
  return s;
}
inline int nextInt() {
  int x;
  if (scanf("%d", &x) != 1) throw;
  return x;
}
inline long long nextInt64() {
  long long x;
  if (scanf("%I64d", &x) != 1) throw;
  return x;
}
inline double nextDouble() {
  double x;
  if (scanf("%lf", &x) != 1) throw;
  return x;
}
const int INF = (int)1E9;
const long long INF64 = (long long)1E18;
const long double EPS = 1E-9;
const long double PI = 3.1415926535897932384626433832795;
const int MAXN = 200100;
struct block {
  long long h, l, r;
  explicit block(long long h = -1, long long l = -1, long long r = -1)
      : h(h), l(l), r(r) {}
  bool operator<(const block &b) const { return h < b.h; }
};
inline long long intersect(const block &b1, const block &b2) {
  return max(0LL, min(b1.r, b2.r) - max(b1.l, b2.l));
}
set<pair<pair<long long, long long>, int> > st;
vector<int> g[MAXN];
block a[MAXN];
long long d[MAXN];
int n;
long long DFS(int v) {
  if (a[v].h == 0) return INF64;
  long long &ans = d[v];
  if (ans != -1) return ans;
  ans = 0;
  for (int i = 0; i < (int)(g[v].size()); i++) {
    int u = g[v][i];
    ans = max(ans, min(DFS(u), intersect(a[u], a[v])));
  }
  return ans;
}
int main() {
  n = nextInt();
  int H = nextInt();
  for (int i = 0; i < (int)(n); i++) {
    a[i].h = nextInt();
    a[i].l = nextInt();
    a[i].r = nextInt();
  }
  a[n++] = block(H, -INF, +INF);
  a[n++] = block(0, -INF, +INF);
  sort(a, a + n);
  st.clear();
  st.insert(make_pair(make_pair(a[0].l, a[0].r), 0));
  for (int i = 1; i < n; i++) {
    pair<pair<long long, long long>, int> cur(
        make_pair(make_pair(a[i].l, a[i].r), i));
    set<pair<pair<long long, long long>, int> >::iterator it =
        st.lower_bound(cur);
    vector<pair<pair<long long, long long>, int> > l;
    if (it != st.begin()) --it;
    while (it != st.end()) {
      if (it->first.second <= cur.first.first) {
        ++it;
        continue;
      }
      if (cur.first.second <= it->first.first) break;
      l.push_back(*it);
      it = st.erase(it);
    }
    g[i].clear();
    for (int j = 0; j < (int)(l.size()); j++) {
      int id = l[j].second;
      bool res = true;
      if (j + 1 < (int)l.size()) {
        int id1 = l[j + 1].second;
        if (intersect(a[id], a[id1]) > 0 && a[id1].h > a[id].h) res = false;
      }
      if (j > 0) {
        int id1 = l[j - 1].second;
        if (intersect(a[id], a[id1]) > 0 && a[id1].h > a[id].h) res = false;
      }
      if (res && intersect(a[i], a[l[j].second]) > 0) g[i].push_back(id);
    }
    st.insert(cur);
    for (int j = 0; j < (int)(l.size()); j++) {
      long long R = min(cur.first.second, l[j].first.second);
      long long L = max(cur.first.first, l[j].first.first);
      if (R < l[j].first.second)
        st.insert(make_pair(make_pair(R, l[j].first.second), l[j].second));
      if (l[j].first.first < L)
        st.insert(make_pair(make_pair(l[j].first.first, L), l[j].second));
    }
  }
  int total = 0;
  for (int i = 0; i < (int)(n); i++) total += (int)g[i].size();
  memset(d, 255, sizeof d);
  cout << DFS(n - 1) << endl;
  return 0;
}
