/*
TASK:lift
LANG:C++
*/
#include <stdio.h>
#include <vector>
#include <algorithm>
#define MAX(ta, tb) (((ta)>(tb))?(ta):(tb))
using namespace std;

int comp(int o1, int o2);
int comp2(pair<int, int> o1, pair<int, int> o2);

	vector<int> a[16];
  pair<int, int> l[16];
  pair<int, int> ans[16], m1, m2;
	int N, T;

int main() {
//  sort(a[0].begin(), a[0].begin()+3, comp);
	int i, j;
  scanf("%d%d", &N, &T);
  for(i=0; i<N; i+=1) {
  	scanf("%d%d", &(l[i].first), &(l[i].second));
  }
  sort(l, l+N, comp2);
  ans[0].first=l[0].first;
  ans[0].second=l[0].second;
  for(i=1; i<N; i+=1) {
  	for(j=0; j<i; j+=1) {
    	if(l[j].second + l[i].second <= T) {
      	a[j].push_back(i);
        a[i].push_back(j);
      }
    }
    if(ans[i-1].first!=-1 && l[i].second + ans[i-1].second <=T) {
    	m1.first=MAX(ans[i-1].first, l[i].first);
      m1.second=ans[i-1].second+l[i].second;
    }
    else m1.first=-1;
    for(j=0; j<a[i].end()-a[i].begin(); j+=1) {
			if(l[i].second + l[a[i][j]].second <=T) break;
    }
    if(j!=a[i].end()-a[i].begin()) {
      m2.first=ans[i-1].first+l[a[i][j]].first+MAX(l[a[i][j]].first, l[i].first);
      m2.second=l[a[i][j]].second+l[i].second;
    }
    else m2.first=-1;
    if(m1.first==-1 && m2.first==-1) {
    	ans[i].first=-1;
    }
    else if(m1.first==-1) {
      ans[i].first=m2.first; ans[i].second=m2.second;
    }
    else if(m2.first==-1) {
      ans[i].first=m1.first; ans[i].second=m1.second;
    }
    else if(m1.first < m2.first) {
      ans[i].first=m1.first; ans[i].second=m1.second;
    }
    else {
      ans[i].first=m2.first; ans[i].second=m2.second;
    }
  }
  printf("%d\n", ans[N-1].first);
	return 0;
}
int comp(int o1, int o2) {
	return -(l[o1].first - l[o2].first);
}
int comp2(pair<int, int> o1, pair<int, int> o2) {
	return -(o1.first - o2.first);
}

