#include <bits/stdc++.h>
using namespace std;
int gcd(int a, int b) {
  int c = a % b;
  while (c != 0) {
    a = b;
    b = c;
    c = a % b;
  }
  return b;
}
struct UnionFind {
  vector<int> par;
  UnionFind(int N) : par(N) {
    for (int i = 0; i < N; i++) par[i] = i;
  }
  int root(int x) {
    if (par[x] == x) return x;
    return par[x] = root(par[x]);
  }
  void unite(int x, int y) {
    int rx = root(x);
    int ry = root(y);
    if (rx == ry) return;
    par[rx] = ry;
  }
  bool same(int x, int y) {
    int rx = root(x);
    int ry = root(y);
    return rx == ry;
  }
};
long long M = 998244353;
vector<long long> fac(1000001);
vector<long long> ifac(1000001);
long long mpow(long long x, long long n) {
  long long ans = 1;
  while (n != 0) {
    if (n & 1) ans = ans * x % M;
    x = x * x % M;
    n = n >> 1;
  }
  return ans;
}
void setcomb() {
  fac[0] = 1;
  ifac[0] = 1;
  for (long long i = 0; i < 1000000; i++) {
    fac[i + 1] = fac[i] * (i + 1) % M;
  }
  ifac[1000000] = mpow(fac[1000000], M - 2);
  for (long long i = 1000000; i > 0; i--) {
    ifac[i - 1] = ifac[i] * i % M;
  }
}
long long comb(long long a, long long b) {
  if (a == 0 && b == 0) return 1;
  if (a < b || a < 0) return 0;
  long long tmp = ifac[a - b] * ifac[b] % M;
  return tmp * fac[a] % M;
}
long long perm(long long a, long long b) {
  if (a == 0 && b == 0) return 1;
  if (a < b || a < 0) return 0;
  return fac[a] * ifac[a - b] % M;
}
long long modinv(long long a) {
  long long b = M, u = 1, v = 0;
  while (b) {
    long long t = a / b;
    a -= t * b;
    swap(a, b);
    u -= t * v;
    swap(u, v);
  }
  u %= M;
  if (u < 0) u += M;
  return u;
}
vector<vector<long long>> mul(vector<vector<long long>> a,
                              vector<vector<long long>> b, int n) {
  int i, j, k, t;
  vector<vector<long long>> c(n);
  for (i = 0; i < n; i++) {
    for (j = 0; j < n; j++) {
      t = 0;
      for (k = 0; k < n; k++) t = (t + a[i][k] * b[k][j] % M) % M;
      c[i].push_back(t);
    }
  }
  return c;
}
template <typename Monoid>
struct SegmentTree {
  int sz;
  vector<Monoid> seg;
  const Monoid M1;
  SegmentTree(int n, const Monoid &M1) : M1(M1) {
    sz = 1;
    while (sz < n) sz <<= 1;
    seg.assign(2 * sz, M1);
  }
  void set(int k, const Monoid &x) { seg[k + sz] = x; }
  void build() {
    for (int k = sz - 1; k > 0; k--) {
      seg[k] = f(seg[2 * k + 0], seg[2 * k + 1]);
    }
  }
  void update(int k, const Monoid &x) {
    k += sz;
    seg[k] = x;
    while (k >>= 1) {
      seg[k] = f(seg[2 * k + 0], seg[2 * k + 1]);
    }
  }
  Monoid query(int a, int b) {
    Monoid L = M1, R = M1;
    for (a += sz, b += sz; a < b; a >>= 1, b >>= 1) {
      if (a & 1) L = f(L, seg[a++]);
      if (b & 1) R = f(seg[--b], R);
    }
    return f(L, R);
  }
  Monoid value(const int &k) const { return seg[k + sz]; }
  Monoid f(Monoid a, Monoid b) { return a + b; }
};
int main() {
  long long n, m, l, r, c, mr = -1, d = 0, i;
  cin >> n >> m;
  priority_queue<pair<pair<long long, long long>, long long>,
                 vector<pair<pair<long long, long long>, long long>>,
                 greater<pair<pair<long long, long long>, long long>>>
      que;
  for (i = 0; i < n; i++) {
    cin >> l >> r >> c;
    que.push(make_pair(make_pair(l, r), c));
  }
  priority_queue<pair<long long, long long>, vector<pair<long long, long long>>,
                 greater<pair<long long, long long>>>
      que2;
  que2.push(make_pair(0, 1));
  while (!que2.empty()) {
    long long nd = que2.top().first, nr = que2.top().second;
    que2.pop();
    if (nr > mr) {
      mr = nr;
      d = nd;
      if (mr == n) {
        cout << d << endl;
        return 0;
      }
      while (!que.empty() && que.top().first.first <= mr) {
        que2.push(make_pair(nd + que.top().second, que.top().first.second));
        que.pop();
      }
    }
  }
  cout << "-1" << endl;
}
