#include <iostream>
#include <queue>
#include <vector>
#include <cstring>
using namespace std;
#define int long long
const int N = 1e5 + 10;
struct edge {
int to, data;
};
struct node {
int num, data;
bool operator < (const node& a) const {
return data < a.data;
}
};
bool pos[N];
int dis[N];
vector<edge> mp[N];
class Solution {
private:
int n, m, u, v, w;
public:
void Input() {
memset(pos, false, sizeof pos);
cin >> n >> m;
for (int i = 1; i <= n; i++) {
dis[i] = 0;
mp[i].clear();
}
for (int i = 1; i <= m; i++) {
cin >> u >> v >> w;
mp[u].push_back({ v, w });
}
}
void Dijkstra() {
priority_queue<node> que;
que.push({ 1, 0 });
dis[1] = 0;
while (!que.empty()) {
node k = que.top();
que.pop();
pos[k.num] = true;
for (int i = 0; i < mp[k.num].size(); i++) {
int to = mp[k.num][i].to;
int weight = mp[k.num][i].data;
int new_dist = k.data + weight;
if (new_dist > dis[to]) {
dis[to] = new_dist;
que.push({ to, new_dist });
}
}
}
}
void Output() {
if (pos[n]) cout << dis[n] << endl;
else cout << -1 << endl;
}
};
signed main() {
Solution solve;
solve.Input();
solve.Dijkstra();
solve.Output();
return 0;
}