#include <bits/stdc++.h>
using namespace std;
struct panel {
  long long num, x;
  bool type;
  long long id;
  panel(long long num, long long x, bool type, long long id)
      : num(num), x(x), type(type), id(id){};
  bool operator<(const panel& a) const {
    if (x != a.x)
      return x < a.x;
    else if (type != a.type)
      return type < a.type;
    else
      return id < a.id;
  }
};
vector<panel> v;
vector<long long> g[100010], c[100010];
set<pair<long long, long long> > s;
long long n, t, h[100010], l[100010], r[100010], ans[100010];
long long dfs(long long u) {
  if (ans[u] != -1) return ans[u];
  if (u == 1) return 1000000000000000009;
  ans[u] = -1000000000000000009;
  for (long long i = 0; i < g[u].size(); i++) {
    ans[u] = max(ans[u], min(c[u][i], dfs(g[u][i])));
  }
  return ans[u];
}
signed main() {
  cin >> n >> t;
  l[0] = l[1] = -1000000000000000009;
  r[0] = r[1] = 1000000000000000009;
  for (long long i = 2; i <= n + 1; i++) {
    scanf("%I64d%I64d%I64d", &h[i], &l[i], &r[i]);
    v.push_back(panel(h[i], l[i], 1, i));
    v.push_back(panel(h[i], r[i], 0, i));
  }
  sort(v.begin(), v.end());
  s.insert(make_pair(t, 0));
  s.insert(make_pair(0, 1));
  for (long long i = 0; i < v.size(); i++) {
    if (!v[i].type) {
      s.erase(make_pair(h[v[i].id], v[i].id));
    } else {
      set<pair<long long, long long> >::iterator it =
          s.insert(make_pair(h[v[i].id], v[i].id)).first;
      it--;
      long long down = it->second;
      it++;
      it++;
      long long up = it->second;
      if (!g[up].empty() && g[up].back() == down) {
        g[up].pop_back();
        c[up].pop_back();
      }
      g[up].push_back(v[i].id);
      c[up].push_back(min(r[up], r[v[i].id]) - max(l[up], l[v[i].id]));
      g[v[i].id].push_back(down);
      c[v[i].id].push_back(min(r[down], r[v[i].id]) - max(l[down], l[v[i].id]));
    }
  }
  memset(ans, -1, sizeof(ans));
  cout << dfs(0) << endl;
  return 0;
}
