#include <bits/stdc++.h>
using namespace std;
long long MOD = 1000000007;
const long long INF = 1LL << 60;
class LazySegTree {
 private:
  const long long def_val_ = INF;
  vector<long long> val_, lazy_;
  long long n_;
  long long comp(long long l, long long r) { return min(l, r); }
  long long getr(long long x, long long y, long long k, long long l,
                 long long r) {
    if (y <= l || r <= x) return def_val_;
    eval(k, l, r);
    if (x <= l && r <= y) return val_[k];
    auto vector<long long> = getr(x, y, 2 * k + 1, l, (l + r) / 2);
    auto vr = getr(x, y, 2 * k + 2, (l + r) / 2, r);
    return comp(vector<long long>, vr);
  }
  void eval(long long k, long long l, long long r) {
    if (lazy_[k] != 0) {
      val_[k] = min(val_[k], lazy_[k]);
      if (r - l > 1) {
        lazy_[2 * k + 1] += lazy_[k] / 2;
        lazy_[2 * k + 2] += lazy_[k] / 2;
      }
      lazy_[k] = 0;
    }
  }
  void add(long long x, long long y, long long v, long long k, long long l,
           long long r) {
    eval(k, l, r);
    if (y <= l || r <= x) return;
    if (x <= l && r <= y) {
      lazy_[k] += (r - l) * v;
      eval(k, l, r);
    } else {
      add(x, y, v, 2 * k + 1, l, (l + r) / 2);
      add(x, y, v, 2 * k + 2, (l + r) / 2, r);
      val_[k] = comp(val_[2 * k + 1], val_[2 * k + 2]);
    }
  }

 public:
  LazySegTree(long long size) {
    n_ = 1;
    while (n_ < size) n_ *= 2;
    val_ = vector<long long>(2 * n_, def_val_);
    lazy_ = vector<long long>(2 * n_, 0);
  }
  void update(long long i, long long v) {
    i += (n_ - 1);
    val_[i] = v;
    while (i > 0) {
      i = (i - 1) / 2;
      val_[i] = comp(val_[2 * i + 1], val_[2 * i + 2]);
    }
  }
  void addRange(long long x, long long y, long long v) {
    add(x, y, v, 0, 0, n_);
  }
  long long getRange(long long x, long long y) { return getr(x, y, 0, 0, n_); }
};
bool cmp(const tuple<long long, long long, long long>& a,
         const tuple<long long, long long, long long>& b) {
  return (get<1>(a) < get<1>(b));
}
int main() {
  long long n, m;
  cin >> n >> m;
  LazySegTree st(n);
  st.update(0, 0);
  vector<tuple<long long, long long, long long>> intervals;
  for (int i = 0; i < (m); ++i) {
    long long l, r, c;
    cin >> l >> r >> c;
    l--, r--;
    intervals.push_back({l, r, c});
  }
  sort((intervals).begin(), (intervals).end(), cmp);
  for (int i = 0; i < (m); ++i) {
    tuple<long long, long long, long long> iv = intervals[i];
    long long l, r, c;
    l = get<0>(iv);
    r = get<1>(iv);
    c = get<2>(iv);
    long long mind = st.getRange(l, r + 1);
    st.addRange(l, r + 1, mind + c);
    for (int j = 0; j < (n); ++j) st.getRange(j, j + 1);
  }
  long long ans = st.getRange(n - 1, n);
  if (ans == INF) {
    cout << -1 << endl;
  } else {
    cout << ans << endl;
  }
  return 0;
}
