Problem:
Score : 600 points

Problem Statement

We have N points numbered 1 to N arranged in a line in this order.

Takahashi decides to make an undirected graph, using these points as the vertices.
In the beginning, the graph has no edge. Takahashi will do M operations to add edges in this graph.
The i-th operation is as follows:

The operation uses integers L_i and R_i between 1 and N (inclusive), and a positive integer C_i. For every pair of integers (s, t) such that L_i \leq s < t \leq R_i, add an edge of length C_i between Vertex s and Vertex t.

The integers L_1, ..., L_M, R_1, ..., R_M, C_1, ..., C_M are all given as input.

Takahashi wants to solve the shortest path problem in the final graph obtained. Find the length of the shortest path from Vertex 1 to Vertex N in the final graph.

Constraints

2 \leq N \leq 10^5

1 \leq M \leq 10^5

1 \leq L_i < R_i \leq N

1 \leq C_i \leq 10^9

Input

Input is given from Standard Input in the following format:

N M
L_1 R_1 C_1
:
L_M R_M C_M

Output

Print the length of the shortest path from Vertex 1 to Vertex N in the final graph.
If there is no shortest path, print -1 instead.

Sample Input 1

4 3
1 3 2
2 4 3
1 4 6

Sample Output 1

5

We have an edge of length 2 between Vertex 1 and Vertex 2, and an edge of length 3 between Vertex 2 and Vertex 4, so there is a path of length 5 between Vertex 1 and Vertex 4.

Sample Input 2

4 2
1 2 1
3 4 2

Sample Output 2

-1

Sample Input 3

10 7
1 5 18
3 4 8
1 3 5
4 7 10
5 9 8
6 10 5
8 10 3

Sample Output 3

28

Solution in C++14 (GCC 5.4.1) (judge verdict: Runtime Error)

#include<cstdio>
#define HH puts("")
#define debug puts("haochiyu!")
#define rep(i, a, n) for (int i = a; i <= n; ++i)
#define per(i, a, n) for (int i = a; i >= n; --i)
namespace io {
	#define N 207
	#define mt long long
	#define in read()
	#define pc putchar
	#define gc getchar()
	#define outk(a) out(a), pc(' ')
	#define outn(a) out(a), pc('\n')
	inline mt read() {
		mt a = 0; char l = ' ', c = gc;
		while (c < '0' || c > '9') l = c, c = gc;
		while (c >= '0' && c <= '9') a = (a << 3) + (a << 1) + (c ^ 48), c = gc;
		return l == '-' ? -a : a;
	} char F[N];
	inline void out(mt a) {
		if (a == 0) {pc('0'); return;}
		if (a < 0) pc('-');
		mt tmp = a < 0 ? -a : a, cnt = 0;
		while (tmp) F[cnt++] = tmp % 10 + '0', tmp /= 10;
		while (cnt) pc(F[--cnt]); return;
	}
	#undef N
	#undef mt
}
using namespace io;
const int inf = 0x3f3f3f3f;
typedef long long ll;

void judge() {
	freopen(".in", "r", stdin);
	freopen(".out", "w", stdout);
}

const int N = 2000000 + 7;
int n = in, m = in, head[N << 2], dis[N << 2], cnt;
struct node {int nxt, to, w;} e[N << 2];
void add(int frm, int to, int w) {
	e[++cnt].nxt = head[frm];
	e[cnt].to = to;
	e[cnt].w = w;
	head[frm] = cnt;
} bool vis[N << 2];
#include<queue>
#include<map>
#include<vector>
#define mp std::make_pair
#define fi first
#define sc second
std::priority_queue<int, std::vector<std::pair<int, int> >, std::greater<std::pair<int, int> > > q;
void dijkstra() {
	for (int i = 1; i <= n; ++i) dis[i] = inf, vis[i] = 0;
	q.push(mp(0, 1)); dis[1] = 0; 
	while (q.size()) {
		int u = q.top().sc; q.pop();
		if (vis[u]) continue; vis[u] = 1;
		for (int i = head[u]; i; i = e[i].nxt) {
			int v = e[i].to; if (vis[v]) continue;
			if (dis[v] > dis[u] + e[i].w) {
				dis[v] = dis[u] + e[i].w;
				q.push(mp(dis[v], v));
			}
		}
	}
}

int main() {
//	judge();
	for (int i = 1; i <= m; ++i) { 
		bool flag = 0;
		int l = in, r = in, w = in;
		for (int j = l; j <= n; ++j) { 
			for (int k = r; k >= 1; --k) {
				if (j == k) {flag = 1; break;}
				add(j, k, w); add(k, j, w);
			} if (flag) break;
		}
	} dijkstra(); out(dis[n] == inf ? -1 : dis[n]);
	return 0;
}