# 3.4.3



import re

from collections import deque

from functools import reduce

from heapq import heappop

from heapq import heappush

from itertools import permutations

from math import pi

from operator import itemgetter

from operator import mul

from operator import xor

from os import linesep

from sys import stdin





def rline() -> str:

    return stdin.readline().strip()





def rlines(hint: int = 1):

    ret = ['' for i in range(hint)]

    for i in range(hint):

        ret[i] = rline()

    return ret





def htokens(hint: int = 1):

    lns = rlines(hint)

    ret = list([ln.split() for ln in lns])

    return ret





def vtokens(hint: int = 1):

    m, _ = htokens()

    wint = len(m)

    ret = [[None] * hint for i in range(wint)]

    for y in range(hint):

        if y != 0:

            m, _ = htokens()

        # convert horizontal to vertical

        x = 0

        for v in m:

            ret[x][y] = v

            x += 1

    # if return value has one and only one element(list),

    if wint == 1:

        # then add an empty list.

        ret.append([])

    return ret





def rint(radix: int = 10) -> int:

    return int(rline(), radix)





def hints(hint: int = 1, radix: int = 10):

    ret = htokens(hint)

    for i in range(len(ret)):

        ret[i] = list([int(v, radix) for v in ret[i]])

    return ret





def vints(hint: int = 1, radix: int = 10):

    ret = vtokens(hint)

    for i in range(len(ret)):

        ret[i] = list([int(v, radix) for v in ret[i]])

    return ret





def mat(hint: int, wint: int):

    return [[None]*wint for i in range(hint)]





def filllist(lst, value: int) -> None:

    # destructive.

    for i in range(len(lst)):

        lst[i] = value





def isprime(n: int) -> bool:

    if n <= 1:

        return False

    if n in (2, 3, 5):

        return True

    if n % 2 == 0:

        return False

    if n % 3 == 0:

        return False

    lst = int(n**0.5)

    f = 5

    while f <= lst:

        if n % f == 0:

            return False

        if n % (f + 2) == 0:

            return False

        f += 6

    return True





def strmat(matrix, lnsep: str = linesep, fieldsep: str = ' ') -> str:

    return lnsep.join([fieldsep.join(map(str, row)) for row in matrix])





def strbool(boolval: int) -> str:

    return ['No', 'Yes'][boolval]





def solve() -> None:

    # read here

    (n, m) = hints()[0]

    ab_s = hints(n)



    # solve here



    # delay asc, prize desc

    ab_s.sort(key=itemgetter(1), reverse=True)

    ab_s.sort(key=itemgetter(0), reverse=False)



    ans = 0

    tasks = []

    ti = 0

    for t in range(m + 1):

        # from (m days after) to today

        while ti < n and ab_s[ti][0] == t:

            a, b = ab_s[ti]

            ti += 1

            heappush(tasks, -b)

        if tasks:

            # do task

            ans -= heappop(tasks)



    # print here

    print(ans)





if __name__ == '__main__':

    solve()

# 3.4.3



import re

from collections import deque

from functools import reduce

from heapq import *

from itertools import permutations

from math import pi

from operator import itemgetter

from operator import mul

from operator import xor

from os import linesep





def isprime(n: int) -> bool:

    if n <= 1:

        return False

    if n in (2, 3, 5):

        return True

    if n % 2 == 0:

        return False

    if n % 3 == 0:

        return False

    lst = int(n**0.5)

    f = 5

    while f <= lst:

        if n % f == 0:

            return False

        if n % (f + 2) == 0:

            return False

        f += 6

    return True





def strmat(matrix, lnsep: str = linesep, fieldsep: str = ' ') -> str:

    return lnsep.join([fieldsep.join(map(str, row)) for row in matrix])





def strbool(boolval: int) -> str:

    return ['No', 'Yes'][boolval]





def solve() -> None:

    # read here

    n, m, *t = list(map(int, open(0).read().split()))



    # solve here

    d = [[] for i in range(m+1)]

    for i in range(n):

        a, b = t[2*i], t[2*i+1]

        if a > m:

            continue

        d[a].append(b)



    ans = 0

    tasks = []

    for t in range(m + 1):

        # from (m days after) to today

        for tasksize in d[t]:

            heappush(tasks, -tasksize)

        if tasks:

            # do task

            ans -= heappop(tasks)



    # print here

    print(ans)





if __name__ == '__main__':

    solve()

# 3.4.3
import re
from collections import deque
from functools import reduce
from heapq import heappop
from heapq import heappush
from itertools import permutations
from math import pi
from operator import itemgetter
from operator import mul
from operator import xor
from os import linesep
from sys import stdin


def rline() -> str:
    return stdin.readline().strip()


def rlines(hint: int = 1):
    ret = ["" for i in range(hint)]
    for i in range(hint):
        ret[i] = rline()
    return ret


def htokens(hint: int = 1):
    lns = rlines(hint)
    ret = list([ln.split() for ln in lns])
    return ret


def vtokens(hint: int = 1):
    m, _ = htokens()
    wint = len(m)
    ret = [[None] * hint for i in range(wint)]
    for y in range(hint):
        if y != 0:
            m, _ = htokens()
        # convert horizontal to vertical
        x = 0
        for v in m:
            ret[x][y] = v
            x += 1
    # if return value has one and only one element(list),
    if wint == 1:
        # then add an empty list.
        ret.append([])
    return ret


def rint(radix: int = 10) -> int:
    return int(rline(), radix)


def hints(hint: int = 1, radix: int = 10):
    ret = htokens(hint)
    for i in range(len(ret)):
        ret[i] = list([int(v, radix) for v in ret[i]])
    return ret


def vints(hint: int = 1, radix: int = 10):
    ret = vtokens(hint)
    for i in range(len(ret)):
        ret[i] = list([int(v, radix) for v in ret[i]])
    return ret


def mat(hint: int, wint: int):
    return [[None] * wint for i in range(hint)]


def filllist(lst, value: int) -> None:
    # destructive.
    for i in range(len(lst)):
        lst[i] = value


def isprime(n: int) -> bool:
    if n <= 1:
        return False
    if n in (2, 3, 5):
        return True
    if n % 2 == 0:
        return False
    if n % 3 == 0:
        return False
    lst = int(n**0.5)
    f = 5
    while f <= lst:
        if n % f == 0:
            return False
        if n % (f + 2) == 0:
            return False
        f += 6
    return True


def strmat(matrix, lnsep: str = linesep, fieldsep: str = " ") -> str:
    return lnsep.join([fieldsep.join(map(str, row)) for row in matrix])


def strbool(boolval: int) -> str:
    return ["No", "Yes"][boolval]


def solve() -> None:
    # read here
    (n, m) = hints()[0]
    ab_s = hints(n)
    # solve here
    # delay asc, prize desc
    ab_s.sort(key=itemgetter(1), reverse=True)
    ab_s.sort(key=itemgetter(0), reverse=False)
    ans = 0
    tasks = []
    ti = 0
    for t in range(m + 1):
        # from (m days after) to today
        while ti < n and ab_s[ti][0] == t:
            a, b = ab_s[ti]
            ti += 1
            heappush(tasks, -b)
        if tasks:
            # do task
            ans -= heappop(tasks)
    # print here
    print(ans)


if __name__ == "__main__":
    solve()

# 3.4.3
import re
from collections import deque
from functools import reduce
from heapq import *
from itertools import permutations
from math import pi
from operator import itemgetter
from operator import mul
from operator import xor
from os import linesep


def isprime(n: int) -> bool:
    if n <= 1:
        return False
    if n in (2, 3, 5):
        return True
    if n % 2 == 0:
        return False
    if n % 3 == 0:
        return False
    lst = int(n**0.5)
    f = 5
    while f <= lst:
        if n % f == 0:
            return False
        if n % (f + 2) == 0:
            return False
        f += 6
    return True


def strmat(matrix, lnsep: str = linesep, fieldsep: str = " ") -> str:
    return lnsep.join([fieldsep.join(map(str, row)) for row in matrix])


def strbool(boolval: int) -> str:
    return ["No", "Yes"][boolval]


def solve() -> None:
    # read here
    n, m, *t = list(map(int, open(0).read().split()))
    # solve here
    d = [[] for i in range(m + 1)]
    for i in range(n):
        a, b = t[2 * i], t[2 * i + 1]
        if a > m:
            continue
        d[a].append(b)
    ans = 0
    tasks = []
    for t in range(m + 1):
        # from (m days after) to today
        for tasksize in d[t]:
            heappush(tasks, -tasksize)
        if tasks:
            # do task
            ans -= heappop(tasks)
    # print here
    print(ans)


if __name__ == "__main__":
    solve()

-from heapq import heappop -from heapq import heappush +from heapq import * -from sys import stdin - - -def rline() -> str: -    return stdin.readline().strip() - - -def rlines(hint: int = 1): -    ret = ["" for i in range(hint)] -    for i in range(hint): -        ret[i] = rline() -    return ret - - -def htokens(hint: int = 1): -    lns = rlines(hint) -    ret = list([ln.split() for ln in lns]) -    return ret - - -def vtokens(hint: int = 1): -    m, _ = htokens() -    wint = len(m) -    ret = [[None] * hint for i in range(wint)] -    for y in range(hint): -        if y != 0: -            m, _ = htokens() -        # convert horizontal to vertical -        x = 0 -        for v in m: -            ret[x][y] = v -            x += 1 -    # if return value has one and only one element(list), -    if wint == 1: -        # then add an empty list. -        ret.append([]) -    return ret - - -def rint(radix: int = 10) -> int: -    return int(rline(), radix) - - -def hints(hint: int = 1, radix: int = 10): -    ret = htokens(hint) -    for i in range(len(ret)): -        ret[i] = list([int(v, radix) for v in ret[i]]) -    return ret - - -def vints(hint: int = 1, radix: int = 10): -    ret = vtokens(hint) -    for i in range(len(ret)): -        ret[i] = list([int(v, radix) for v in ret[i]]) -    return ret - - -def mat(hint: int, wint: int): -    return [[None] * wint for i in range(hint)] - - -def filllist(lst, value: int) -> None: -    # destructive. -    for i in range(len(lst)): -        lst[i] = value -    (n, m) = hints()[0] -    ab_s = hints(n) +    n, m, *t = list(map(int, open(0).read().split())) -    # delay asc, prize desc -    ab_s.sort(key=itemgetter(1), reverse=True) -    ab_s.sort(key=itemgetter(0), reverse=False) +    d = [[] for i in range(m + 1)] +    for i in range(n): +        a, b = t[2 * i], t[2 * i + 1] +        if a > m: +            continue +        d[a].append(b) -    ti = 0 -        while ti < n and ab_s[ti][0] == t: -            a, b = ab_s[ti] -            ti += 1 -            heappush(tasks, -b) +        for tasksize in d[t]: +            heappush(tasks, -tasksize)