#include <bits/stdc++.h>
using namespace std;
template <class T>
inline bool chmax(T &a, T b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class T>
inline bool chmin(T &a, T b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
class Edge {
 public:
  int l;
  int r;
  int c;
};
const int MAX_N = 100000;
const int MAX_M = 100000;
int n;
int m;
Edge edges[MAX_M];
long long dp[10000][10000];
void print_edges() {
  for (int i = 0; i < m; i++) {
    printf("edges[%d]: {l=%d, r=%d, c=%d}\n", i, edges[i].l, edges[i].r,
           edges[i].c);
  }
}
void print_dp() {
  for (int y = 0; y < m; y++) {
    for (int x = 0; x < n; x++) {
      if (dp[y][x] == LONG_LONG_MAX) {
        printf("%05d ", -1);
      } else {
        printf("%05lld ", dp[y][x]);
      }
    }
    printf("\n");
  }
}
int main(void) {
  cin >> n;
  cin >> m;
  for (int i = 0; i < m; i++) {
    int l, r, c;
    cin >> l >> r >> c;
    edges[i].l = l;
    edges[i].r = r;
    edges[i].c = c;
  }
  for (int y = 0; y < m; y++) {
    for (int x = 1; x < n; x++) {
      dp[y][x] = LONG_LONG_MAX;
    }
  }
  auto f = [](const Edge &a, const Edge &b) {
    if (a.l < b.l) {
      return true;
    } else if (a.l > b.l) {
      return false;
    } else {
      return a.r < b.r;
    }
  };
  sort(&edges[0], &edges[m - 1], f);
  if (edges[0].l == 1) {
    for (int x = edges[0].l; x < edges[0].r; x++) {
      dp[0][x] = edges[0].c;
    }
  }
  for (int y = 1; y < m; y++) {
    for (int x = edges[y].l - 1; x <= edges[y].r - 1; x++) {
      long long m = (dp[y - 1][edges[y].l - 1] + edges[y].c < dp[y - 1][x])
                        ? dp[y - 1][edges[y].l - 1] + edges[y].c
                        : dp[y - 1][x];
      chmin(dp[y][x], m);
    }
  }
  if (dp[m - 1][n - 1] == LONG_LONG_MAX) {
    cout << -1 << endl;
  } else {
    cout << dp[m - 1][n - 1] << endl;
  }
  return 0;
}
