#include <bits/stdc++.h>
using namespace std;
int IT_MAX = 1 << 17;
int MOD = 998244353;
const int INF = 0x3f3f3f3f;
const long long LL_INF = 0x0f3f3f3f3f3f3f3f;
const double PI = acos(-1);
const double ERR = 1e-10;
long long mod(long long a, long long m) {
  return (a + (abs(a) / m) * m + m) % m;
}
struct do_elem {
  long long min = LL_INF;
  long long to_change = -1;
};
vector<long long> mas(101010);
vector<do_elem> st(404040);
void propagate(long long node) {
  if (st[node].to_change != -1) {
    st[node * 2].min = st[node].to_change;
    st[node * 2].to_change = st[node].to_change;
    st[node * 2 + 1].to_change = st[node].to_change;
    st[node * 2 + 1].min = st[node].to_change;
    st[node].to_change = -1;
  }
}
long long change_seg(long long node, long long l, long long r, long long tl,
                     long long tr, long long change) {
  if (l > r) {
    return LL_INF;
  }
  if (tl != tr) {
    propagate(node);
  }
  if (tl == l && tr == r) {
    st[node].min = change;
    st[node].to_change = change;
    return st[node].min;
  }
  long long mid = (tl + tr) / 2;
  long long left_res = change_seg(node * 2, l, min(r, mid), tl, mid, change);
  long long right_res =
      change_seg(node * 2 + 1, max(mid + 1, l), r, mid + 1, tr, change);
  st[node].min = min(st[2 * node + 1].min, st[2 * node].min);
  return st[node].min;
}
long long get_seg(long long node, long long l, long long r, long long tl,
                  long long tr) {
  if (l > r) {
    return LL_INF;
  }
  if (tl != tr) {
    propagate(node);
  }
  if (tl == l && tr == r) {
    return st[node].min;
  }
  long long mid = (tl + tr) / 2;
  long long left_res = get_seg(node * 2, l, min(r, mid), tl, mid);
  long long right_res = get_seg(node * 2 + 1, max(mid + 1, l), r, mid + 1, tr);
  return min(left_res, right_res);
}
struct elem {
  long long l;
  long long r;
  long long c;
};
int main() {
  ios_base::sync_with_stdio(false);
  cout.tie(0);
  cin.tie(0);
  long long n, m;
  cin >> n >> m;
  vector<elem> v(m);
  for (int i = 0; i < m; ++i) {
    cin >> v[i].l >> v[i].r >> v[i].c;
  }
  sort((v).begin(), (v).end(), [](elem l, elem r) {
    if (l.r != r.r) {
      return l.r < r.r;
    } else if (l.l != r.l) {
      return l.l < r.l;
    } else
      return l.c < r.c;
  });
  change_seg(1, v[0].l, v[0].r, 1, n, v[0].c);
  long long mx = v[0].r;
  for (int i = 1; i < m; ++i) {
    if (v[i].l > mx) continue;
    long long mi = get_seg(1, v[i].l, min(mx, v[i].r - 1), 1, n) + v[i].c;
    long long last = get_seg(1, v[i].r, v[i].r, 1, n);
    if (last > mi) {
      change_seg(1, v[i].r, v[i].r, 1, n, mi);
    }
    mx = v[i].r;
  }
  long long ans = get_seg(1, n, n, 1, n);
  if (ans < LL_INF)
    cout << ans;
  else
    cout << -1;
  return 0;
}
