#include <bits/stdc++.h>
using namespace std;
using ll = long long;
static const ll INF = 10000000000000;
ll dat[400005];
ll n;
void init(ll n_) {
  n = 1;
  while (n < n_) n *= 2;
  for (ll i = 0; i < 2 * n - 1; i++) dat[i] = INF;
}
void update(ll k, ll a) {
  k += n - 1;
  dat[k] = a;
  while (0 < k) {
    k = (k - 1) / 2;
    dat[k] = min(dat[2 * k + 1], dat[2 * k + 2]);
  }
}
ll query(ll a, ll b, ll k, ll l, ll r) {
  if (b <= l || r <= a)
    return INF;
  else if (a <= l && r <= b)
    return dat[k];
  else {
    ll val = query(a, b, 2 * k + 1, l, (l + r) / 2);
    ll var = query(a, b, 2 * k + 2, (l + r) / 2, r);
    return min(val, var);
  }
}
ll N, M;
int main() {
  cin >> N >> M;
  init(N);
  vector<pair<pair<ll, ll>, ll>> A(M);
  for (int i = 0; i < M; i++) {
    ll l, r, c;
    cin >> l >> r >> c;
    l--;
    r--;
    pair<ll, ll> p(r, l);
    pair<pair<ll, ll>, ll> q(p, c);
    A[i] = q;
  }
  sort(A.begin(), A.end());
  update(0, 0);
  for (int i = 0; i < M; i++) {
    ll r = A[i].first.first;
    ll l = A[i].first.second;
    ll c = A[i].second;
    ll m = query(l, r, 0, 0, n);
    if (m == INF) continue;
    if (m + c < dat[r + n - 1]) update(r, m + c);
  }
  if (dat[N - 1 + n - 1] < INF)
    cout << dat[N - 1 + n - 1] << endl;
  else
    cout << -1 << endl;
  return 0;
}
