import Control.Monad
import Data.List

main = do
  li <- getLine
  let [n,m] = map read $ words li
  bcs <- sequence $ replicate n (do
    li <- getLine
    let [a,b] = map read $ words li
    return (b,m-a)
    )
  let ans = compute m bcs
  print ans

{-
金額の大きいものから、1～M日の予定に詰められるなら加算、詰められないなら除く、
詰め方を持ち回さないと時間が足らない気もする
集合の全てのaについて、a以上の数がm-a+1以下なら、収めることができる。
c=m-aとおくと、
全てのcについて、c未満の数がc個以下
これは、整列したときに、[1..]より小さいということ
-}
compute :: Int -> [(Int,Int)] -> Int
compute m bcs = fst $ foldl' step (0,[]) bcs1
  where
    bcs1 = reverse $ sort bcs
    step (acc,cs) (b,c)
      | valid cs1 = (acc+b,cs1)
      | otherwise = (acc,cs)
      where
        cs1 = insert c cs
    valid xs = and $ zipWith (>=) xs [0..]
