#include <bits/stdc++.h>
using namespace std;
const long long INF = 1e9 + 1;
const long long LINF = 1e18 + 1;
const long long MOD = 1e9 + 7;
const double PI = acos(-1);
const double EPS = 1e-9;
const int MAX_N = 1e5;
long long dist[MAX_N + 1] = {};
struct Road {
  int l;
  int r;
  int c;
};
bool asc(const Road &a, const Road &b) {
  if (a.l == b.l)
    return a.r < b.r;
  else
    return a.l < b.l;
}
int main(void) {
  int n, m;
  scanf("%d%d", &n, &m);
  fill_n(dist, n + 1, LINF);
  dist[1] = 0;
  vector<Road> li(m);
  for (int(i) = (0); (i) < (m); (i)++) {
    scanf("%d%d%d", &li[i].l, &li[i].r, &li[i].c);
  }
  sort((li).begin(), (li).end(), asc);
  for (int(i) = (0); (i) < (li.size() - 1); (i)++) {
    if (li[i].l == li[i].r && li[i + 1].l == li[i + 1].r) {
      if (li[i].c > li[i + 1].c)
        li.erase(li.begin() + i);
      else
        li.erase(li.begin() + i + 1);
      i--;
    }
  }
  for (int(i) = (0); (i) < (li.size()); (i)++) {
    long long mini = LINF;
    for (int(j) = (li[i].l); (j) < (li[i].r); (j)++) {
      mini = min(mini, dist[j]);
    }
    dist[li[i].r] = min(dist[li[i].r], mini + li[i].c);
  }
  if (dist[n] != LINF)
    cout << (dist[n]) << endl;
  else
    cout << (-1) << endl;
  return 0;
}
