unittest
{
	assert( [ "4 3", "1 3 2", "2 4 3", "1 4 6" ].parse.expand.solve == 5 );
	assert( [ "4 2", "1 2 1", "3 4 2" ].parse.expand.solve == -1 );
	assert( [ "10 7", "1 5 18", "3 4 8", "1 3 5", "4 7 10", "5 9 8", "6 10 5", "8 10 3" ].parse.expand.solve == 28 );
}



import std.algorithm;
import std.conv;
import std.range;
import std.stdio;
import std.typecons;

void main()
{
	stdin.byLineCopy.parse.expand.solve.writeln;
}

auto parse( Range )( Range input )
if( isInputRange!Range && is( ElementType!Range == string ) )
{
	auto nm = input.front.split.to!( long[] );
	auto lrcs = new long[ 3 ][ nm[ 1 ] ];
	foreach( ref lrc; lrcs )
	{
		input.popFront;
		lrc = input.front.split.to!( long[] );
		lrc[ 0 .. 2 ] -= 1;
	}
	return tuple( nm[ 0 ], lrcs );
}

auto solve( long n, long[ 3 ][] lrcs )
{
	lrcs.sort();
	
	// 頂点Lから頂点Rへ距離Cの有向辺を張る
	auto nss = new Tuple!( long, long )[][ n ];
	auto ec = 0L;
	foreach( lrc; lrcs )
	{
		nss[ lrc[ 0 ] ] ~= tuple( lrc[ 1 ], lrc[ 2 ] );
		ec++;
	}
	
	// 頂点Rから頂点Lまでの全頂点間へ距離0の有向辺を張る
	foreach( lrc; lrcs )
	{
		foreach_reverse( i; lrc[ 0 ] .. lrc[ 1 ] )
		{
			if( !nss[ i + 1 ].empty && nss[ i + 1 ][ $ - 1 ][ 0 ] == i ) break;
			nss[ i + 1 ] ~= tuple( i, 0L );
			ec++;
		}
	}
	
	// 最短距離を探索
	auto ds = dijkstra( nss, ec, 0 );
	return ( ds[ $ - 1 ] == long.max ) ? -1 : ds[ $ - 1 ];
}

// 正の重み付きグラフの始点指定最短経路探索（ダイクストラ法）
auto dijkstra( Tuple!( long, long )[][] nss, long ec, long s )
{
	import std.container.binaryheap;
	
	auto ds = new long[ nss.length ];
	ds[] = long.max;
	ds[ s ] = 0;
	auto us = new bool[ nss.length ];
	auto uc = 0L;
	
	auto queue = heapify!( ( a, b ) => b[ 1 ] < a[ 1 ] )( new Tuple!( long, long )[ ec ], 0 );
	queue.insert( tuple( s, 0L ) );
	while( !queue.empty )
	{
		auto fi = queue.front[ 0 ];
		auto fd = queue.front[ 1 ];
		queue.popFront();
		
		if( us[ fi ] ) continue;
		us[ fi ] = true;
		uc++;
		if( uc == us.length ) break;
		
		foreach( t; nss[ fi ] )
		{
			auto ti = t[ 0 ];
			auto td = fd + t[ 1 ];
			
			if( ds[ ti ] <= td ) continue;
			
			ds[ ti ] = td;
			queue.insert( tuple( ti, td ) );
		}
	}
	return ds;
}
