#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
using pli = pair<ll, int>;
const int INF = 0x3f3f3f3f, N = 2e5 + 5;
const ll LINF = 0x3f3f3f3f3f3f3f3f;
int n, m;
int head[N << 4], cnt, tot;
struct node {
  int to, next, w;
} e[N << 5];
struct seg {
  int l, r, id;
} tin[N << 4], tout[N << 4];
void add(int u, int v, int w) {
  e[++cnt].next = head[u];
  e[cnt].to = v;
  e[cnt].w = w;
  head[u] = cnt;
}
void build(int p, int l, int r) {
  tin[p].l = l, tin[p].r = r;
  tout[p].l = l, tout[p].r = r;
  if (l == r) {
    tin[p].id = tout[p].id = l;
    return;
  }
  int mid = (l + r) >> 1;
  build(p << 1, l, mid);
  build(p << 1 | 1, mid + 1, r);
  tin[p].id = ++tot;
  tout[p].id = ++tot;
  add(tin[p].id, tin[p << 1].id, 0);
  add(tin[p].id, tin[p << 1 | 1].id, 0);
  add(tout[p << 1].id, tout[p].id, 0);
  add(tout[p << 1 | 1].id, tout[p].id, 0);
}
void treeadd2(int p, int x, int y, int u, int w) {
  int l = tout[p].l, r = tout[p].r;
  if (l >= x && r <= y) {
    add(tout[p].id, u, w);
    return;
  }
  int mid = (l + r) >> 1;
  if (x <= mid) treeadd2(p << 1, x, y, u, w);
  if (y > mid) treeadd2(p << 1 | 1, x, y, u, w);
}
ll dis[N];
bool vis[N];
void Dijkstra(int s) {
  memset(dis, 0x3f, sizeof(dis));
  memset(vis, 0, sizeof(vis));
  dis[s] = 0;
  priority_queue<pli, vector<pli>, greater<pli>> q;
  q.push(make_pair(0, s));
  while (!q.empty()) {
    int u = q.top().second;
    q.pop();
    if (vis[u]) continue;
    vis[u] = 1;
    for (int i = head[u]; i; i = e[i].next) {
      int v = e[i].to;
      if (dis[v] > dis[u] + e[i].w) {
        dis[v] = dis[u] + e[i].w;
        q.push(make_pair(dis[v], v));
      }
    }
  }
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cin >> n >> m;
  tot = n;
  build(1, 1, n);
  for (int i = 1; i <= m; i++) {
    int l, r, c;
    cin >> l >> r >> c;
    treeadd2(1, l, r - 1, r, c);
  }
  Dijkstra(1);
  if (dis[n] == LINF)
    cout << -1;
  else
    cout << dis[n];
  return 0;
}
