from heapq import heappop, heappush, heapify
import sys
input = lambda: sys.stdin.readline().rstrip()
inpl = lambda: list(map(int,input().split()))

#####  動的計画法（DP）による解法  #####
N, M = inpl()
LRC = sorted([inpl() for _ in range(M)])
# L,Rとして登場する点だけを取り出す。中間点が寄与することはない。
points = sorted(list({lrc[i] for i in range(2) for lrc in LRC}))
# 1またはNが無ければ終了。
if points[0] > 1 or points[-1] < N:
    print(-1)
    exit()

# 各経路の(1からの距離、有効範囲の限界点)ペアをヒープに格納。
# 初期状態は「(距離0、点1まで)」。
dq = [(0,1)]
m = 0 # エッジ群の番号。開始点の順にソートされている。
# DPループ。
# DP部分の計算量は O(M log M)。ヒープを叩くのは総計M+M回なので。Nにはよらない。
# 上のソート等も O(M log M) なので全体の計算量も同じ。
for i in points:
    # 有効範囲が終了したものを捨てる。
    # 距離が長いものは捨てずに放置しておいてもOK。
    while dq and dq[0][1] < i:
        heappop(dq)
    # 現在の点まで到達する経路が無ければ終了。
    if not dq:
        print(-1)
        break
    # 点1から現在の点までの最短距離。
    d = dq[0][0]
    # 現在の点から始まる各エッジ群による(距離、限界点)を順に格納。
    while m < M and LRC[m][0] == i:
        heappush(dq, (d+LRC[m][2], LRC[m][1]))
        m += 1
else:
    # 最後の点Nまで正常に終了した場合。
    print(d)
