/*
TASK: lift
LANG: C++
*/

#include <cstdio>
#include <algorithm>

using namespace std;

#define MAX 20005

#define INF 123456789

#define MINF(a, b) (((a) < (b)) ? (a) : (b))

struct item
{
       int a, b;
       
       item() {}
       item(int a1, int b1) { a = a1; b = b1; }
       bool operator < (const item &z) const
       {
            if(a != z.a) return a > z.a;
            if(b != z.b) return b > z.b;
            
            return false;
       }
};

void input(void);
void solve(void);

int greedy1(void);

int n, m;
item A[MAX];

int main(void)
{
    input();
    solve();
    
    return 0;
}

void input(void)
{
     int a, b;
     int i;
     
     scanf("%d %d", &n, &m);
     
     for(i = 0; i < n; i++) {
       scanf("%d %d", &a, &b);
       A[i] = item(a, b);
     }
}

void solve(void)
{
     int ans;
     int a, b;
     
     a = greedy1();
     b = INF;
     
     ans = MINF(a, b);
     
     if(ans == INF) ans = 0; 
     
     printf("%d\n", ans);
}

int greedy1(void)
{
    int sum, ans;
    int left, right;
    int x, y, z;
    int i, j;
    
    sort(A, A + n);
    
    left = 0; right = n - 1; sum = 0;
    for(i = 0; i < n; i++) sum += A[i].b;
    
    ans = 0;
    for( ; ; ) {
      if(left > right) break;
      if(sum <= m) { ans += A[right].a; break; }
      x = 0;
      for(i = left; i <= right; i++) {
        if(x + A[i].b > m) break;
        x += A[i].b;
      }
      i--; sum -= x;
      if(i <= left) return INF; 
      
      ans += A[i].a;
      ans += A[left].a;
      sum += A[i].b;
      
      left = i;
    }
    
    return ans;
}
      
         

