#include <bits/stdc++.h>
using namespace std;
long long sqr(long long x) { return x * x; }
template <class T>
void checkmax(T &t, T x) {
  if (x > t) t = x;
}
template <class T>
void checkmin(T &t, T x) {
  if (x < t) t = x;
}
template <class T>
void _checkmax(T &t, T x) {
  if (t == -1 || x > t) t = x;
}
template <class T>
void _checkmin(T &t, T x) {
  if (t == -1 || x < t) t = x;
}
const int N = 100005;
const int INF = 1000000000;
int n;
int f[N];
pair<int, pair<int, int> > a[N];
bool can_flow(int i, int j) {
  return a[i].first > a[j].first &&
         max(a[i].second.first, a[j].second.first) <
             min(a[i].second.second, a[j].second.second);
}
int main() {
  int m;
  scanf("%d%d", &n, &m);
  for (int i = 0; i < (int)(n); i++) {
    scanf("%d%d%d", &a[i].first, &a[i].second.first, &a[i].second.second);
  }
  sort(a, a + n);
  set<pair<pair<int, int>, int> > S;
  S.insert(make_pair(make_pair(-INF, INF), n + 1));
  memset(f, 0xff, sizeof(f));
  f[n + 1] = INF * 2;
  a[n].first = m;
  a[n].second = make_pair(-INF, INF);
  a[n + 1].first = 0;
  a[n + 1].second = make_pair(-INF, INF);
  for (int i = 0; i < (int)(n + 1); i++) {
    pair<int, int> b = a[i].second;
    __typeof((S).begin()) it =
        S.lower_bound(make_pair(make_pair(b.first, 0), 0));
    if (it != S.begin()) --it;
    vector<pair<pair<int, int>, int> > vec;
    vector<pair<pair<int, int>, int> > del;
    while (it != S.end() && it->first.first < b.second) {
      pair<int, int> c = it->first;
      pair<int, int> d =
          make_pair(max(b.first, c.first), min(b.second, c.second));
      if (d.first < d.second) {
        if (c.first < b.first || c.second > b.second) vec.push_back(*it);
        bool flag = 1;
        __typeof((S).begin()) j = it;
        if (j != S.begin()) j--;
        if (j != S.end() && can_flow(j->second, it->second) &&
            can_flow(i, j->second))
          flag = 0;
        j = it;
        ++j;
        if (j != S.end() && can_flow(j->second, it->second) &&
            can_flow(i, j->second))
          flag = 0;
        if (flag) checkmax(f[i], min(f[it->second], d.second - d.first));
        del.push_back(*it);
      }
      it++;
    }
    for (__typeof((del).begin()) j = (del).begin(); j != (del).end(); j++)
      S.erase(*j);
    for (__typeof((vec).begin()) j = (vec).begin(); j != (vec).end(); j++) {
      if (j->first.first < b.first) {
        S.insert(make_pair(make_pair(j->first.first, b.first), j->second));
      }
      if (j->first.second > b.second) {
        S.insert(make_pair(make_pair(b.second, j->first.second), j->second));
      }
    }
    S.insert(make_pair(make_pair(b.first, b.second), i));
  }
  for (int i = 0; i < (int)(n + 1); i++) {
  }
  printf("%d\n", f[n]);
  return 0;
}
