#include <bits/stdc++.h>
#pragma GCC optimize("O3")
#pragma GCC target("avx")
using namespace std;
const int K = 19;
const int KM = 1 << (K - 1);
int dat[1 << K];
int laz[1 << K];
int zero = 2e9;
void eval(int A, int l, int r) {
  if (laz[A] == zero) return;
  if (A * 2 < 1 << K) {
    laz[A * 2] = min(laz[A * 2], laz[A]);
    laz[A * 2 + 1] = min(laz[A * 2 + 1], laz[A]);
  }
  dat[A] = min(dat[A], laz[A]);
  laz[A] = zero;
}
int update(int L, int R, int X, int A, int l, int r) {
  eval(A, l, r);
  if (r <= L || R <= l) return dat[A];
  if (L <= l && r <= R) {
    laz[A] = min(laz[A], X);
    return min(dat[A], laz[A]);
  }
  dat[A] = min(update(L, R, X, A * 2, l, (l + r) / 2),
               update(L, R, X, A * 2 + 1, (l + r) / 2, r));
  return dat[A];
}
void add(int L, int R, int X) { update(L, R, X, 1, 0, KM); }
int check(int L, int R, int A, int l, int r) {
  eval(A, l, r);
  if (r <= L || R <= l) return zero;
  if (L <= l && r <= R) return dat[A];
  return min(check(L, R, A * 2, l, (l + r) / 2),
             check(L, R, A * 2 + 1, (l + r) / 2, r));
}
int query(int L, int R) { return check(L, R, 1, 0, KM); }
int main() {
  int N, M;
  cin >> N >> M;
  for (int i = 0; i < (1 << K); i++) {
    dat[i] = zero;
    laz[i] = zero;
  }
  tuple<int, int, int> LRC[100000];
  for (int i = 0; i < (M); i++) {
    int l, r, c;
    cin >> l >> r >> c;
    LRC[i] = tie(l, r, c);
  }
  sort(LRC, LRC + M);
  add(1, 2, 0);
  for (int i = 0; i < (M); i++) {
    int k = query(get<0>(LRC[i]), get<0>(LRC[i]) + 1) + get<2>(LRC[i]);
    add(1, get<1>(LRC[i]) + 1, k);
  }
  int kotae = query(N, N + 1);
  if (kotae != zero)
    cout << (query(N, N + 1)) << "\n";
  else
    cout << (-1) << "\n";
  return 0;
}
