#include <bits/stdc++.h>
using namespace std;
template <class T>
inline bool chmax(T& a, T b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T>
inline bool chmin(T& a, T b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}
struct io {
  io() {
    ios::sync_with_stdio(false);
    cin.tie(0);
  };
};
const int MOD = 1000000007;
const int INF = INT_MAX;
const long long int LLINF = 1LL << 62;
class DIJKSTRA {
 public:
  int V;
  struct edge {
    int to;
    int cost;
  };
  typedef pair<int, int> PI;
  vector<vector<edge> > G;
  vector<int> d;
  vector<int> prev;
  DIJKSTRA(int size) {
    V = size;
    G = vector<vector<edge> >(V);
    prev = vector<int>(V, -1);
  }
  void add(int from, int to, int cost) {
    edge e = {to, cost};
    G[from].push_back(e);
  }
  void dijkstra(int s) {
    priority_queue<PI, vector<PI>, greater<PI> > que;
    d = vector<int>(V, INF);
    d[s] = 0;
    que.push(PI(0, s));
    while (!que.empty()) {
      PI p = que.top();
      que.pop();
      int v = p.second;
      if (d[v] < p.first) continue;
      for (int i = 0; i < G[v].size(); i++) {
        edge e = G[v][i];
        if (d[e.to] > d[v] + e.cost) {
          d[e.to] = d[v] + e.cost;
          prev[e.to] = v;
          que.push(PI(d[e.to], e.to));
        }
      }
    }
  }
  vector<int> get_path(int t) {
    vector<int> path;
    for (; t != -1; t = prev[t]) {
      path.push_back(t);
    }
    reverse(path.begin(), path.end());
    return path;
  }
  void show() {
    for (int i = 0; i < d.size() - 1; i++) {
      cout << d[i] << " ";
    }
    cout << d[d.size() - 1] << endl;
  }
};
int main(void) {
  int n, m;
  cin >> n >> m;
  DIJKSTRA dj(n);
  for (int i = 0; i < m; i++) {
    int l, r, c;
    cin >> l >> r >> c;
    dj.add(l - 1, r - 1, c);
  }
  for (int i = 0; i < n - 1; i++) {
    dj.add(i + 1, i, 0);
  }
  dj.dijkstra(0);
  cout << ((dj.d[n - 1] == INF) ? -1 : dj.d[n - 1]) << endl;
}
