#include <bits/stdc++.h>
using namespace std;
const int MOD = 1e9 + 7;
const int INF = 1e9;
const int magic = 348;
struct node {
  int h, l, r;
  int num;
} a[100048];
pair<int, int> e[200048];
int top = 0;
int d[200048];
queue<int> q;
int seq[200048], stop = 0;
int dp[200048];
int n, t;
set<pair<int, int> > m, s;
set<pair<int, int> >::iterator iter;
int head[200048], nxt[400048], to[400048], f[400048], tot = 1;
inline void addedge(int s, int t, int len) {
  to[++tot] = t;
  nxt[tot] = head[s];
  head[s] = tot;
  f[tot] = len;
  d[t]++;
}
int main() {
  int i, j, up, down, first, second;
  scanf("%d%d", &n, &t);
  for (i = 1; i <= n; i++) {
    scanf("%d%d%d", &a[i].h, &a[i].l, &a[i].r);
    a[i].num = i;
  }
  a[n + 1].h = 0;
  a[n + 1].l = -INF;
  a[n + 1].r = INF;
  a[n + 2].h = t;
  a[n + 2].l = -INF;
  a[n + 2].r = INF;
  for (i = 1; i <= n; i++) {
    e[++top].first = a[i].l;
    e[top].second = i;
    e[++top].first = a[i].r;
    e[top].second = -i;
  }
  sort(e + 1, e + top + 1);
  s.insert(make_pair(0, n + 1));
  s.insert(make_pair(t, n + 2));
  m.insert(make_pair(n + 1, n + 2));
  for (i = 1; i <= top; i++) {
    if (e[i].second < 0) {
      s.erase(make_pair(a[-e[i].second].h, -e[i].second));
      continue;
    }
    iter = s.lower_bound(make_pair(a[e[i].second].h, e[i].second));
    up = iter->second;
    down = (--iter)->second;
    m.erase(make_pair(down, up));
    m.insert(make_pair(down, e[i].second));
    m.insert(make_pair(e[i].second, up));
    s.insert(make_pair(a[e[i].second].h, e[i].second));
  }
  int l1, l2, r1, r2, flow;
  for (iter = m.begin(); iter != m.end(); iter++) {
    l1 = a[iter->first].l;
    l2 = a[iter->second].l;
    r1 = a[iter->first].r;
    r2 = a[iter->second].r;
    flow = min(r1, r2) - max(l1, l2);
    addedge(iter->first, iter->second, flow);
  }
  for (i = 1; i <= n + 2; i++)
    if (!d[i]) q.push(i);
  while (!q.empty()) {
    first = q.front();
    q.pop();
    seq[++stop] = first;
    for (i = head[first]; i; i = nxt[i]) {
      second = to[i];
      d[second]--;
      if (!d[second]) q.push(second);
    }
  }
  dp[n + 1] = 2 * INF;
  for (i = 1; i <= stop; i++) {
    first = seq[i];
    for (j = head[first]; j; j = nxt[j]) {
      second = to[j];
      dp[second] = max(dp[second], min(f[j], dp[first]));
    }
  }
  printf("%d\n", dp[n + 2]);
  return 0;
}
