#include <bits/stdc++.h>
using namespace std;
struct addedge {
  int L;
  int R;
  long long C;
};
vector<long long> dist;
int N, M, n;
vector<addedge> A;
set<int> s;
bool sort_addedge(const addedge &x, const addedge &y) {
  if (x.R == y.R)
    return x.L < y.L;
  else
    return x.R < y.R;
}
void update(int i, long long x) {
  i += n - 1;
  dist[i] = x;
  while (i > 0) {
    i = (i - 1) / 2;
    dist[i] = min(dist[i * 2 + 1], dist[i * 2 + 2]);
  }
}
long long query(int a, int b, int k, int l, int r) {
  if (r <= a || b >= l) return 12345678901234567LL;
  if (a <= l && r <= b) return dist[k];
  long long ret1 = query(a, b, 2 * k + 1, l, (l + r) / 2);
  long long ret2 = query(a, b, 2 * k + 2, (l + r) / 2, r);
  return min(ret1, ret2);
}
int main() {
  cin >> N >> M;
  n = 1;
  while (n < N) n *= 2;
  dist = vector<long long>(2 * n - 1, 12345678901234567LL);
  for (int i = 0; i < M; i++) {
    addedge a;
    cin >> a.L >> a.R >> a.C;
    a.L--;
    a.R--;
    A.push_back(a);
  }
  sort(A.begin(), A.end(), sort_addedge);
  update(0, 0LL);
  s.insert(0);
  for (auto a : A) {
    auto it = s.lower_bound(a.L);
    if (it != s.end()) {
      int f = *it;
      long long df = dist[f + n - 1];
      long long dt = dist[a.R + n - 1];
      if (df + a.C < dt) {
        update(a.R, df + a.C);
        s.insert(a.R);
      }
    }
  }
  long long ans = (dist[N - 1 + n - 1] == 12345678901234567LL)
                      ? (-1)
                      : (dist[N - 1 + n - 1]);
  cout << ans << endl;
  return 0;
}
