#include <bits/stdc++.h>
template <class T>
bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T>
bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return 1;
  }
  return 0;
}
using namespace std;
template <class Monoid>
class SegmentTree {
 public:
  using Func = function<Monoid(Monoid, Monoid)>;
  const Func F;
  const Monoid M1;
  int sz;
  vector<Monoid> seg;
  SegmentTree(int n, const Func fu, const Monoid &m1) : F(fu), M1(m1) {
    init(n);
  }
  void init(int n) {
    sz = 1;
    while (sz < n) sz *= 2;
    seg.assign(sz * 2, M1);
  }
  void update(int k, const Monoid &x) {
    k += sz;
    seg[k] = x;
    while (k >>= 1) {
      seg[k] = F(seg[k * 2], seg[k * 2 + 1]);
    }
  }
  Monoid query(int l, int r) {
    Monoid L = M1, R = M1;
    l += sz;
    r += sz;
    for (; l < r; l >>= 1, r >>= 1) {
      if (l & 1) L = F(L, seg[l++]);
      if (r & 1) R = F(seg[--r], R);
    }
    return F(L, R);
  }
};
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  long long n, m;
  cin >> n >> m;
  struct kukann {
    long long l, r, c;
  };
  vector<kukann> lr(m);
  for (int i = 0; i < (int)(m); i++) {
    cin >> lr[i].l >> lr[i].r >> lr[i].c;
    lr[i].l--;
  }
  sort((lr).begin(), (lr).end(), [&](kukann a, kukann b) { return a.r < b.r; });
  SegmentTree<long long> st(
      n + 7, [&](long long a, long long b) { return min(a, b); }, 1e17);
  st.update(0, 0);
  long long id = 0;
  for (int i = 0; i < (int)(n + 1); i++) {
    while (id < n && lr[id].r == i) {
      long long nc = lr[id].c + st.query(lr[id].l, lr[id].r);
      nc = min(nc, st.query(lr[id].r - 1, lr[id].r));
      st.update(lr[id].r - 1, nc);
      id++;
    }
  }
  long long res = st.query(n - 1, n);
  if (res >= 1e17) res = -1;
  cout << res << endl;
  return 0;
}
