# 抽象化をやめる

class Rmq(object):

    __slots__ = ["elem_size", "tree", "real_size"]



    def __init__(self, a):

        if hasattr(a, "__iter__"):

            self.real_size = len(a)

            self.elem_size = elem_size = 1 << (self.real_size-1).bit_length()

            self.tree = tree = [float("inf")] * (elem_size * 2)

            tree[elem_size:elem_size + self.real_size] = a

            for i in range(elem_size - 1, 0, -1):

                tree[i] = min(tree[i << 1], tree[(i << 1) + 1])

        elif isinstance(a, int):

            self.real_size = a

            self.elem_size = elem_size = 1 << (self.real_size-1).bit_length()

            self.tree = [float("inf")] * (elem_size * 2)



    def get_value(self, x: int, y: int) -> int:  # 半開区間

        l, r = x + self.elem_size, y + self.elem_size

        tree = self.tree

        result = float("inf")

        while l < r:

            if l & 1:

                result = min(tree[l], result)

                l += 1

            if r & 1:

                r -= 1

                result = min(tree[r], result)

            l, r = l >> 1, r >> 1

        return result



    def set_value(self, i: int, value: int) -> None:

        k = self.elem_size + i

        tree = self.tree

        tree[k] = value

        while k > 1:

            k >>= 1

            tree[k] = min(tree[k << 1], tree[(k << 1) + 1])



    def get_one_value(self, i):

        return self.tree[i+self.elem_size]



    def debug(self):

        print((self.tree[self.elem_size:self.elem_size+self.real_size]))





from operator import itemgetter



N, M = list(map(int, input().split()))

LRC = [list(map(int, input().split())) for _ in range(M)]

LRC.sort(key=itemgetter(0))



idx_LRC = 0

q = []



seg = Rmq(N+1)



seg.set_value(1, 0)

for v in range(1, N + 1):

    d = seg.get_value(v, N + 1)

    while idx_LRC < M:

        l, r, c = LRC[idx_LRC]

        if l <= v:

            seg.set_value(r, min(seg.tree[r + seg.elem_size], d + c))

            idx_LRC += 1

        else:

            break

ans = seg.tree[N + seg.elem_size]

print((ans if ans != float("inf") else -1))

# RMQ のパフォーマンステスト

class Rmq:

    # 平方分割

    # 値を変更すると元のリストの値も書き換わる

    # 検証: http://judge.u-aizu.ac.jp/onlinejudge/review.jsp?rid=3990681

    def __init__(self, a, sqrt_n=150, inf=(1<<31)-1):

        self.sqrt_n = sqrt_n

        if hasattr(a, "__iter__"):

            from itertools import zip_longest

            self.n = len(a)

            self.layer0 = [min(values) for values in zip_longest(*[iter(a)]*sqrt_n, fillvalue=inf)]

            self.layer1 = a

        elif isinstance(a, int):

            self.n = a

            self.layer0 = [inf] * ((a - 1) // sqrt_n + 1)

            self.layer1 = [inf] * a

        else:

            raise TypeError



    def get_min(self, l, r):

        sqrt_n = self.sqrt_n

        parent_l, parent_r = l//sqrt_n+1, (r-1)//sqrt_n

        if parent_l < parent_r:

            return min(min(self.layer0[parent_l:parent_r]),

                       min(self.layer1[l:parent_l*sqrt_n]),

                       min(self.layer1[parent_r*sqrt_n:r]))

        else:

            return min(self.layer1[l:r])



    def set_value(self, idx, val):

        self.layer1[idx] = val

        idx0 = idx // self.sqrt_n

        idx1 = idx0 * self.sqrt_n

        self.layer0[idx0] = min(self.layer1[idx1:idx1+self.sqrt_n])



    def chmin(self, idx, val):

        if self.layer1[idx] > val:

            self.layer1[idx] = val

            idx //= self.sqrt_n

            self.layer0[idx] = min(self.layer0[idx], val)



    def debug(self):

        print(("layer0=", self.layer0))

        print(("layer1=", self.layer1))



    def __getitem__(self, item):

        return self.layer1[item]



    def __setitem__(self, key, value):

        self.set_value(key, value)





from operator import itemgetter



N, M = list(map(int, input().split()))

LRC = [list(map(int, input().split())) for _ in range(M)]

LRC.sort(key=itemgetter(0))



idx_LRC = 0

q = []



inf = 10**18

seg = Rmq(N+1, inf=inf)



seg.set_value(1, 0)

for v in range(1, N + 1):

    d = seg.get_min(v, N + 1)

    while idx_LRC < M:

        l, r, c = LRC[idx_LRC]

        if l <= v:

            seg.chmin(r, d+c)

            idx_LRC += 1

        else:

            break

ans = seg[N]

print((ans if ans != inf else -1))

# 抽象化をやめる
class Rmq(object):
    __slots__ = ["elem_size", "tree", "real_size"]

    def __init__(self, a):
        if hasattr(a, "__iter__"):
            self.real_size = len(a)
            self.elem_size = elem_size = 1 << (self.real_size - 1).bit_length()
            self.tree = tree = [float("inf")] * (elem_size * 2)
            tree[elem_size : elem_size + self.real_size] = a
            for i in range(elem_size - 1, 0, -1):
                tree[i] = min(tree[i << 1], tree[(i << 1) + 1])
        elif isinstance(a, int):
            self.real_size = a
            self.elem_size = elem_size = 1 << (self.real_size - 1).bit_length()
            self.tree = [float("inf")] * (elem_size * 2)

    def get_value(self, x: int, y: int) -> int:  # 半開区間
        l, r = x + self.elem_size, y + self.elem_size
        tree = self.tree
        result = float("inf")
        while l < r:
            if l & 1:
                result = min(tree[l], result)
                l += 1
            if r & 1:
                r -= 1
                result = min(tree[r], result)
            l, r = l >> 1, r >> 1
        return result

    def set_value(self, i: int, value: int) -> None:
        k = self.elem_size + i
        tree = self.tree
        tree[k] = value
        while k > 1:
            k >>= 1
            tree[k] = min(tree[k << 1], tree[(k << 1) + 1])

    def get_one_value(self, i):
        return self.tree[i + self.elem_size]

    def debug(self):
        print((self.tree[self.elem_size : self.elem_size + self.real_size]))


from operator import itemgetter

N, M = list(map(int, input().split()))
LRC = [list(map(int, input().split())) for _ in range(M)]
LRC.sort(key=itemgetter(0))
idx_LRC = 0
q = []
seg = Rmq(N + 1)
seg.set_value(1, 0)
for v in range(1, N + 1):
    d = seg.get_value(v, N + 1)
    while idx_LRC < M:
        l, r, c = LRC[idx_LRC]
        if l <= v:
            seg.set_value(r, min(seg.tree[r + seg.elem_size], d + c))
            idx_LRC += 1
        else:
            break
ans = seg.tree[N + seg.elem_size]
print((ans if ans != float("inf") else -1))

# RMQ のパフォーマンステスト
class Rmq:
    # 平方分割
    # 値を変更すると元のリストの値も書き換わる
    # 検証: http://judge.u-aizu.ac.jp/onlinejudge/review.jsp?rid=3990681
    def __init__(self, a, sqrt_n=150, inf=(1 << 31) - 1):
        self.sqrt_n = sqrt_n
        if hasattr(a, "__iter__"):
            from itertools import zip_longest

            self.n = len(a)
            self.layer0 = [
                min(values)
                for values in zip_longest(*[iter(a)] * sqrt_n, fillvalue=inf)
            ]
            self.layer1 = a
        elif isinstance(a, int):
            self.n = a
            self.layer0 = [inf] * ((a - 1) // sqrt_n + 1)
            self.layer1 = [inf] * a
        else:
            raise TypeError

    def get_min(self, l, r):
        sqrt_n = self.sqrt_n
        parent_l, parent_r = l // sqrt_n + 1, (r - 1) // sqrt_n
        if parent_l < parent_r:
            return min(
                min(self.layer0[parent_l:parent_r]),
                min(self.layer1[l : parent_l * sqrt_n]),
                min(self.layer1[parent_r * sqrt_n : r]),
            )
        else:
            return min(self.layer1[l:r])

    def set_value(self, idx, val):
        self.layer1[idx] = val
        idx0 = idx // self.sqrt_n
        idx1 = idx0 * self.sqrt_n
        self.layer0[idx0] = min(self.layer1[idx1 : idx1 + self.sqrt_n])

    def chmin(self, idx, val):
        if self.layer1[idx] > val:
            self.layer1[idx] = val
            idx //= self.sqrt_n
            self.layer0[idx] = min(self.layer0[idx], val)

    def debug(self):
        print(("layer0=", self.layer0))
        print(("layer1=", self.layer1))

    def __getitem__(self, item):
        return self.layer1[item]

    def __setitem__(self, key, value):
        self.set_value(key, value)


from operator import itemgetter

N, M = list(map(int, input().split()))
LRC = [list(map(int, input().split())) for _ in range(M)]
LRC.sort(key=itemgetter(0))
idx_LRC = 0
q = []
inf = 10**18
seg = Rmq(N + 1, inf=inf)
seg.set_value(1, 0)
for v in range(1, N + 1):
    d = seg.get_min(v, N + 1)
    while idx_LRC < M:
        l, r, c = LRC[idx_LRC]
        if l <= v:
            seg.chmin(r, d + c)
            idx_LRC += 1
        else:
            break
ans = seg[N]
print((ans if ans != inf else -1))

-# 抽象化をやめる -class Rmq(object): -    __slots__ = ["elem_size", "tree", "real_size"] +# RMQ のパフォーマンステスト +class Rmq: +    # 平方分割 +    # 値を変更すると元のリストの値も書き換わる +    # 検証: http://judge.u-aizu.ac.jp/onlinejudge/review.jsp?rid=3990681 +    def __init__(self, a, sqrt_n=150, inf=(1 << 31) - 1): +        self.sqrt_n = sqrt_n +        if hasattr(a, "__iter__"): +            from itertools import zip_longest -    def __init__(self, a): -        if hasattr(a, "__iter__"): -            self.real_size = len(a) -            self.elem_size = elem_size = 1 << (self.real_size - 1).bit_length() -            self.tree = tree = [float("inf")] * (elem_size * 2) -            tree[elem_size : elem_size + self.real_size] = a -            for i in range(elem_size - 1, 0, -1): -                tree[i] = min(tree[i << 1], tree[(i << 1) + 1]) +            self.n = len(a) +            self.layer0 = [ +                min(values) +                for values in zip_longest(*[iter(a)] * sqrt_n, fillvalue=inf) +            ] +            self.layer1 = a -            self.real_size = a -            self.elem_size = elem_size = 1 << (self.real_size - 1).bit_length() -            self.tree = [float("inf")] * (elem_size * 2) +            self.n = a +            self.layer0 = [inf] * ((a - 1) // sqrt_n + 1) +            self.layer1 = [inf] * a +        else: +            raise TypeError -    def get_value(self, x: int, y: int) -> int:  # 半開区間 -        l, r = x + self.elem_size, y + self.elem_size -        tree = self.tree -        result = float("inf") -        while l < r: -            if l & 1: -                result = min(tree[l], result) -                l += 1 -            if r & 1: -                r -= 1 -                result = min(tree[r], result) -            l, r = l >> 1, r >> 1 -        return result +    def get_min(self, l, r): +        sqrt_n = self.sqrt_n +        parent_l, parent_r = l // sqrt_n + 1, (r - 1) // sqrt_n +        if parent_l < parent_r: +            return min( +                min(self.layer0[parent_l:parent_r]), +                min(self.layer1[l : parent_l * sqrt_n]), +                min(self.layer1[parent_r * sqrt_n : r]), +            ) +        else: +            return min(self.layer1[l:r]) -    def set_value(self, i: int, value: int) -> None: -        k = self.elem_size + i -        tree = self.tree -        tree[k] = value -        while k > 1: -            k >>= 1 -            tree[k] = min(tree[k << 1], tree[(k << 1) + 1]) +    def set_value(self, idx, val): +        self.layer1[idx] = val +        idx0 = idx // self.sqrt_n +        idx1 = idx0 * self.sqrt_n +        self.layer0[idx0] = min(self.layer1[idx1 : idx1 + self.sqrt_n]) -    def get_one_value(self, i): -        return self.tree[i + self.elem_size] +    def chmin(self, idx, val): +        if self.layer1[idx] > val: +            self.layer1[idx] = val +            idx //= self.sqrt_n +            self.layer0[idx] = min(self.layer0[idx], val) -        print((self.tree[self.elem_size : self.elem_size + self.real_size])) +        print(("layer0=", self.layer0)) +        print(("layer1=", self.layer1)) + +    def __getitem__(self, item): +        return self.layer1[item] + +    def __setitem__(self, key, value): +        self.set_value(key, value) -seg = Rmq(N + 1) +inf = 10**18 +seg = Rmq(N + 1, inf=inf) -    d = seg.get_value(v, N + 1) +    d = seg.get_min(v, N + 1) -            seg.set_value(r, min(seg.tree[r + seg.elem_size], d + c)) +            seg.chmin(r, d + c) -ans = seg.tree[N + seg.elem_size] -print((ans if ans != float("inf") else -1)) +ans = seg[N] +print((ans if ans != inf else -1))