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: Wrong Answer)

#include<bits/stdc++.h>
using namespace std;
int t[800040],a[800040];
void push_down(int rt){
    //if(a[rt]==0x3f3f3f3f)return;
	t[rt] = min(t[rt], a[rt]);
    a[rt*2+1]=min(a[rt*2+1],a[rt]);
    a[rt*2+2]=min(a[rt*2+2],a[rt]);
    t[rt*2+1]=min(t[rt*2+1],a[rt*2+1]);
    t[rt*2+2]=min(t[rt*2+2],a[rt*2+2]);
    t[rt]=min(t[rt*2+1],t[rt*2+2]);
    a[rt]=0x3f3f3f3f;
}
void update(int rt,int l,int r,int nl,int nr,int x){
    if(l<=nl&&nr<=r)t[rt]=min(t[rt],x),a[rt]=min(a[rt],x);
    else if(nr<l||nl>r)return;
    else{
        push_down(rt);
        int mid=(nl+nr)/2;
        update(rt*2+1,l,r,nl,mid,x);
        update(rt*2+2,l,r,mid+1,nr,x);
        push_down(rt);
    }
}
int query(int rt,int l,int r,int nl,int nr){
    //printf("%d %d %d %d %d\n",rt,l,r,nl,nr);
    push_down(rt);
    if(l<=nl&&nr<=r)return t[rt];
    else if(nr<l||nl>r)return 0x3f3f3f3f;
    else{
        int mid=(nl+nr)/2;
        //cout<<"!"<<min(query(rt*2+1,l,r,nl,mid),query(rt*2+2,l,r,mid+1,nr))<<endl;
        return min(query(rt*2+1,l,r,nl,mid),query(rt*2+2,l,r,mid+1,nr));
    }
}
int n,m;
int tot=0;
struct cell{
    int l,r,c;
} z[200010];
bool comp(cell a,cell b){
    return a.l==b.l?a.r<b.r:a.l<b.l;
}
int main(){
    //freopen("out","w",stdout);
    memset(t,0x3f,sizeof(t));
    memset(a,0x3f,sizeof(a));
    cin>>n>>m;
    update(0,1,1,0,n,0);
    for(int i=0;i<m;i++){
        int _l,_r,_c;
        cin>>_l>>_r>>_c;
        z[tot].l=_l,z[tot].r=_r,z[tot++].c=_c;
    }
    sort(z,z+tot,comp);
    //for(int i=0;i<=2*n;i++)cout<<t[i]<<endl;
    for(int i=0;i<tot;i++){
        int mn=query(0,z[i].l,z[i].r,0,n);
        //cout<<mn<<endl;
        mn+=z[i].c;
        update(0,z[i].l,z[i].r,0,n,mn);
    }/*
    for(int i=1;i<=n;i++){
        cout<<query(0,i,i,0,n)<<endl;
    }*/
    int ans=query(0,n,n,0,n);
    if(ans==0x3f3f3f3f)cout<<-1<<endl;
    else cout<<ans<<endl;
    return 0;
}