#include <bits/stdc++.h>
using namespace std;
const long long N = 100005;
char en = '\n';
long long inf = 1e17;
long long mod = 998244353;
long long power(long long x, long long n, long long mod) {
  long long res = 1;
  x %= mod;
  while (n) {
    if (n & 1) res = (res * x) % mod;
    x = (x * x) % mod;
    n >>= 1;
  }
  return res;
}
struct data {
  long long mn;
  data() : mn(inf){};
};
struct SegTree {
  long long N;
  vector<data> st;
  vector<bool> cLazy;
  vector<long long> lazy;
  void init(long long n) {
    N = n;
    st.resize(4 * N + 5);
    cLazy.assign(4 * N + 5, false);
    lazy.assign(4 * N + 5, inf);
  }
  void merge(data &cur, data &l, data &r) { cur.mn = min(l.mn, r.mn); }
  void propagate(long long node, long long L, long long R) {
    if (L != R) {
      cLazy[node * 2] = 1;
      cLazy[node * 2 + 1] = 1;
      lazy[node * 2] = min(lazy[node * 2], lazy[node]);
      lazy[node * 2 + 1] = min(lazy[node * 2 + 1], lazy[node]);
    }
    st[node].mn = min(st[node].mn, lazy[node]);
    cLazy[node] = 0;
  }
  void build(long long node, long long L, long long R) {
    if (L == R) {
      st[node].mn = 1e9;
      return;
    }
    long long M = (L + R) / 2;
    build(node * 2, L, M);
    build(node * 2 + 1, M + 1, R);
    merge(st[node], st[node * 2], st[node * 2 + 1]);
  }
  data Query(long long node, long long L, long long R, long long i,
             long long j) {
    if (cLazy[node]) propagate(node, L, R);
    if (j < L || i > R) return data();
    if (i <= L && R <= j) return st[node];
    long long M = (L + R) / 2;
    data left = Query(node * 2, L, M, i, j);
    data right = Query(node * 2 + 1, M + 1, R, i, j);
    data cur;
    merge(cur, left, right);
    return cur;
  }
  data pQuery(long long node, long long L, long long R, long long pos) {
    if (cLazy[node]) propagate(node, L, R);
    if (L == R) return st[node];
    long long M = (L + R) / 2;
    if (pos <= M)
      return pQuery(node * 2, L, M, pos);
    else
      return pQuery(node * 2 + 1, M + 1, R, pos);
  }
  void Update(long long node, long long L, long long R, long long i,
              long long j, long long val) {
    if (cLazy[node]) propagate(node, L, R);
    if (j < L || i > R) return;
    if (i <= L && R <= j) {
      cLazy[node] = 1;
      lazy[node] = min(lazy[node], val);
      propagate(node, L, R);
      return;
    }
    long long M = (L + R) / 2;
    Update(node * 2, L, M, i, j, val);
    Update(node * 2 + 1, M + 1, R, i, j, val);
    merge(st[node], st[node * 2], st[node * 2 + 1]);
  }
  void pUpdate(long long node, long long L, long long R, long long pos,
               long long val) {
    if (cLazy[node]) propagate(node, L, R);
    if (L == R) {
      cLazy[node] = 1;
      lazy[node] = val;
      propagate(node, L, R);
      return;
    }
    long long M = (L + R) / 2;
    if (pos <= M)
      pUpdate(node * 2, L, M, pos, val);
    else
      pUpdate(node * 2 + 1, M + 1, R, pos, val);
    merge(st[node], st[node * 2], st[node * 2 + 1]);
  }
  data query(long long pos) { return pQuery(1, 1, N, pos); }
  data query(long long l, long long r) { return Query(1, 1, N, l, r); }
  void update(long long pos, long long val) { pUpdate(1, 1, N, pos, val); }
  void update(long long l, long long r, long long val) {
    Update(1, 1, N, l, r, val);
  }
};
struct node {
  long long L, R, c;
  node() {}
  node(long long L, long long R, long long c) : L(L), R(R), c(c) {}
};
bool comp(node &a, node &b) { return a.L < b.L; }
int32_t main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  long long n, m;
  cin >> n >> m;
  node arr[m + 5];
  for (long long i = 1; i <= m; i++) {
    cin >> arr[i].L >> arr[i].R >> arr[i].c;
  }
  sort(arr + 1, arr + m + 1, comp);
  long long curr = 1;
  long long ptr = 1;
  SegTree obj;
  obj.init(n);
  for (long long i = 1; i <= n; i++) {
    obj.update(i, i, inf);
  }
  obj.update(1, 1, 0);
  set<pair<long long, long long>> pq;
  while (ptr <= n && arr[ptr].L <= curr) {
    pq.insert({arr[ptr].c, ptr});
    ptr++;
  }
  while (!pq.empty()) {
    pair<long long, long long> val = *pq.begin();
    pq.erase(pq.begin());
    long long indx = val.second;
    long long L = arr[indx].L, R = arr[indx].R, c = arr[indx].c;
    long long min1 = obj.query(L, R).mn;
    obj.update(L, R, min1 + c);
    curr = max(curr, R);
    while (ptr <= n && arr[ptr].L <= curr) {
      pq.insert({arr[ptr].c, ptr});
      ptr++;
    }
  }
  long long ans = obj.query(n, n).mn;
  if (ans > 1e15)
    cout << -1 << en;
  else
    cout << ans << en;
  return 0;
}
