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: Accepted)

/*
Though leaves are many, the root is one;
Through all the lying days of my youth
I swayed my leaves and flowers in the sun,
Now may I wither into the truth.

- William Butler Yeats
*/
#include <iostream>
#include <algorithm>
#include <math.h>
#include <string.h>
#include <cstdio>
#include <vector>
#include <set>
#include <cassert>
#include <cstdlib>
#include <complex>
#include <cctype>
#include <cmath>
#include <ctime>
#include <deque>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <sstream>
#include <functional>
#include <iomanip>
#include <bitset>
//#include <windows.h>  //Should be deleted when using AtCoder&POJ
using namespace std;

#define ll long long
#define pii pair<int,int>
#define qi ios::sync_with_stdio(0)
/**==Info==
*Program:1
*Problem:Shortest Path on a Line
*Date:2019-11-11
*Algorithm:My Set
*Status:Unknown*/

bool debug=false;

template<typename T> struct pq_small{
	priority_queue<T,vector<T>,greater<T> > pq;
	void push(T x){
		pq.push(x);
	}

	void pop(){
		pq.pop();
	}

	int size(){
		return pq.size();
	}

	bool empty(){
		return pq.empty();
	}

	T top(){
		return pq.top();
	}
};

int n,m;

vector<pair<int,ll>> ra[100005];

ll dis[100005];

pq_small<pair<int,ll>> kill;
multiset<ll> val;

const ll inf=1e18;

int main(int argc,char* argv[]){
	qi;
	cin>>n>>m;
	for(int i=0;i<m;i++){
		int a,b,c;
		cin>>a>>b>>c;
		a--;b--;
		ra[a].push_back(make_pair(b,c));
	}
	
	for(int i=0;i<n;i++){
		
//		cout<<"Current at "<<i<<endl;
//		for(int j:val){
//			cout<<j<<" ";
//		}
//		cout<<endl;
		
		//value
		if(i==0){
			dis[i]=0;
		}else{
			if(val.empty()){
				dis[i]=inf;
			}else{
				dis[i]=*val.begin();	
			}
			
		}
		
		//remove
		while(!kill.empty()){
			pair<int,ll> last=kill.top();
			if(last.first==i){
				val.erase(val.find(last.second));
//				val.erase(last.second);
				kill.pop();
//				cout<<"Remove:"<<last.second<<endl;
			}else{
				break;
			}
		}
		
		//shoot the bullet
		for(pii x:ra[i]){
			ll v=0ll+x.second+dis[i];
//			cout<<"INsert "<<x.first<<" "<<v<<endl;
			kill.push(make_pair(x.first,v));
			val.insert(v);
		}
		
		
	}
	
	if(dis[n-1]>=inf){
		cout<<"-1";
	}else{
		cout<<dis[n-1]<<endl;	
	}
	
	return 0;
}