#include <bits/stdc++.h>
using namespace std;
struct Edge {
  long long int from, to, cost;
};
long long int mod(long long int a, long long int mod) {
  long long int res = a % mod;
  if (res < 0) res = res + mod;
  return res;
}
long long int modpow(long long int a, long long int n, long long int mod) {
  long long int res = 1;
  while (n > 0) {
    if (n & 1) res = res * a % mod;
    a = a * a % mod;
    n >>= 1;
  }
  return res;
}
long long int modinv(long long int a, long long int mod) {
  return modpow(a, mod - 2, mod);
}
long long int gcd(long long int a, long long int b) {
  long long int r = a % b;
  if (r == 0)
    return b;
  else
    return gcd(b, a % b);
}
bool is_prime(long long int n) {
  long long int i = 2;
  if (n == 1) return false;
  if (n == 2) return true;
  bool res = true;
  while (i * i < n) {
    if (n % i == 0) {
      res = false;
    }
    i = i + 1;
  }
  if (n % i == 0) res = false;
  return res;
}
map<long long int, long long int> v[100100];
vector<long long int> cost;
int main() {
  long long int N, M;
  cin >> N >> M;
  cost = vector<long long int>(N, 1e16);
  for (long long int i = 0; i < (N - 1); i++) {
    v[i + 1][i] = 0;
  }
  for (long long int i = 0; i < (M); i++) {
    long long int l, r, c;
    cin >> l >> r >> c;
    l--;
    r--;
    if (v[l].count(r) == 0) {
      v[l][r] = c;
    } else {
      v[l][r] = min(c, v[l][r]);
    }
  }
  cost[0] = 0;
  queue<pair<int, int> > que;
  que.push({0, 0});
  while (!que.empty()) {
    pair<int, int> p = que.front();
    long long int from = p.second;
    que.pop();
    if (p.first > cost[from]) continue;
    for (auto iedge : v[from]) {
      long long int to = iedge.first;
      long long int c = iedge.second;
      if (cost[to] > cost[from] + c) {
        cost[to] = cost[from] + c;
        que.push({cost[to], to});
      }
    }
  }
  cout << (cost[N - 1] == 1e16 ? -1 : cost[N - 1]);
  return 0;
}
