#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
const int mod = 1e9 + 7;
int n, m;
long long dis[100010];
struct Node {
  int u, v, w;
} t[100010];
bool cmp(const Node &x, const Node &y) {
  if (x.u == y.u) return x.v <= y.v;
  return x.u < y.u;
}
struct segment_tree {
  int minv[4 * 100010];
  inline void build(int o, int l, int r) {
    if (l == r) {
      minv[o] = inf;
      return;
    }
    int mid = (l + r) >> 1;
    build((o << 1), l, mid);
    build((o << 1 | 1), mid + 1, r);
    minv[o] = min(minv[(o << 1)], minv[(o << 1 | 1)]);
  }
  inline long long query(int o, int l, int r, int q) {
    if (l == r) return minv[o];
    int mid = (l + r) >> 1;
    minv[(o << 1)] = min(minv[(o << 1)], minv[o]);
    minv[(o << 1 | 1)] = min(minv[(o << 1 | 1)], minv[o]);
    if (q <= mid)
      return query((o << 1), l, mid, q);
    else
      return query((o << 1 | 1), mid + 1, r, q);
  }
  inline void add(int o, int l, int r, int ql, int qr, int v) {
    if (ql <= l && qr >= r) {
      minv[o] = min(v, minv[o]);
      return;
    }
    int mid = (l + r) >> 1;
    if (ql <= mid) add((o << 1), l, mid, ql, qr, v);
    if (qr > mid) add((o << 1 | 1), mid + 1, r, ql, qr, v);
  }
} tree;
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= m; i++) scanf("%d%d%d", &t[i].u, &t[i].v, &t[i].w);
  sort(t + 1, t + m + 1, cmp);
  tree.build(1, 1, n);
  tree.add(1, 1, n, 1, 1, 0);
  for (int i = 1; i <= m; i++) {
    int u = t[i].u;
    long long num = tree.query(1, 1, n, u);
    tree.add(1, 1, n, u + 1, t[i].v, t[i].w + num);
  }
  dis[n] = tree.query(1, 1, n, n);
  if (dis[n] == inf)
    puts("-1");
  else
    cout << dis[n] << endl;
  return 0;
}
