#include <bits/stdc++.h>
using ll = long long;
using namespace std;
int n;
int st[(1 << 28) - 1];
void init(int n_) {
  n = 1;
  while (n < n_) n = 2 * n;
  for (int i = 0; i < 2 * n - 1; ++i) st[i] = (1 << 28);
}
void update(int k, int a) {
  k += n - 1;
  st[k] = a;
  while (k) {
    k = (k - 1) / 2;
    st[k] = min(st[2 * k + 1], st[2 * k + 2]);
  }
}
int query(int a, int b, int k, int l, int r) {
  if (b <= l || r <= a) {
    return (1 << 28);
  } else if (a <= l && r <= b) {
    return st[k];
  } else {
    return min(query(a, b, 2 * k + 1, l, (l + r) / 2),
               query(a, b, 2 * k + 2, (l + r) / 2, r));
  }
}
struct absn {
  int l;
  int r;
  int cost;
};
int main() {
  int dn;
  cin >> dn;
  init(dn);
  int m;
  cin >> m;
  vector<absn> s(m);
  for (int i = 0; i < m; ++i) {
    cin >> s[i].l >> s[i].r >> s[i].cost;
    --s[i].l;
    --s[i].r;
  }
  sort(s.begin(), s.end(), [](const absn& x, const absn& y) {
    return (x.r == y.r) ? (x.l < y.l) : (x.r < y.r);
  });
  update(0, 0);
  for (int i = 0; i < m; ++i) {
    update(s[i].r, min(query(s[i].r, s[i].r + 1, 0, 0, n),
                       query(s[i].l, s[i].r, 0, 0, n) + s[i].cost));
  }
  int ans = query(dn - 1, dn, 0, 0, n);
  cout << (ans == (1 << 28) ? -1 : ans) << endl;
}
