#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define int ll
const int MAXN = 1e6 + 5;
const int inf = (int)2e9 + 5;
const int infll = (int)4e18 + 5;
const int mod = (int)1e9 + 7;
void solve(){
int n, M;
cin >> n >> M;
vector<int> v(n+1), m(n + 1);
set<int> s;
for(int i = 1; i <= n; i++) {
cin >> v[i] >> m[i];
s.insert(m[i]);
}
int m1, m2;
m1 = *s.begin();
if((int)s.size() > 1) m2 = *s.rbegin();
else m2 = m1;
vector<vector<int>> g(2), pref(2);
for(int i = 1; i <= n; i++) {
if(m[i] == m1) g[0].push_back(v[i]);
else if(m[i] == m2) g[1].push_back(v[i]);
}
sort(g[0].rbegin(), g[0].rend());
if(s.size() > 1) sort(g[1].rbegin(), g[1].rend());
for(int i = 0; i < s.size(); i++) {
pref[i].push_back(0);
for(int j = 0; j < g[i].size(); j++) {
pref[i].push_back(pref[i].back() + g[i][j]);
}
}
int c1 = M / m1;
int res = pref[0][min((int)g[0].size(), c1)];
if(s.size() > 1) {
for(int i = 0 ; i <= c1; i++) {
int c2 = (M - 1ll*m1*i) / m2;
res = max(res, pref[0][(min(i,(int)g[0].size()))] + pref[1][min((int)g[1].size(), c2)]);
}
}
cout << res << endl;
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
int t = 1;
//cin >> t;
while(t--)
solve();
return 0;
}