#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
long long a[N], seg[N << 1];
struct edge {
  int l, r, c;
} ed[N];
int n, m;
void update(int l, int r, long long x, int id = 1, int st = 0, int en = n) {
  if (r <= st || en <= l) return;
  if (l <= st && en <= r) {
    seg[id] = min(seg[id], x);
    return;
  }
  int mid = st + en >> 1;
  update(l, r, x, id << 1, st, mid);
  update(l, r, x, id << 1 | 1, mid, en);
}
long long get(int p, int id = 1, int st = 0, int en = n) {
  if (en - st == 1) return seg[id];
  int mid = st + en >> 1;
  return min(seg[id],
             p < mid ? get(p, id << 1, st, mid) : get(p, id << 1 | 1, mid, en));
}
inline void read_input() {
  cin >> n >> m;
  for (int i = 0; i < m; i++) {
    int l, r, c;
    cin >> l >> r >> c;
    ed[i] = {--l, r, c};
  }
}
inline void solve() {
  memset(seg, 63, sizeof seg), update(0, 1, 0);
  sort(ed, ed + m, [](edge e1, edge e2) { return e1.l < e2.l; });
  for (int i = 0, p = 0; i < n; i++)
    if ((a[i] = get(i)) < get(i + 1))
      for (; p < m && ed[p].l <= i; p++)
        if (ed[p].r > i) update(ed[p].l, ed[p].r, a[i] + ed[p].c);
  cout << (a[n - 1] < 1e18 ? a[n - 1] : -1);
}
int main() {
  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  read_input(), solve();
  return 0;
}
