#include <bits/stdc++.h>
using namespace std;
vector<vector<int> > v(3);
long long s[3][100005];
int m;
long long f1(int y, int z) {
  if (m - 3 * z - 2 * y < 0) {
    return 0;
  }
  long long val = 0;
  if (z > 0) val += s[2][z - 1];
  if (y > 0) val = val + s[1][y - 1];
  if (m - 3 * z - 2 * y > 0) {
    val += s[0][min(m - 3 * z - 2 * y - 1, (int)v[0].size() - 1)];
  }
  return val;
}
long long compute(int z) {
  int m1 = m;
  long long ans = -100;
  m1 -= z * 3;
  if (m1 < 0) {
    return 0;
  }
  int l = 0;
  int r = min((int)v[1].size(), m1 / 2);
  while (r - l >= 3) {
    int mid1 = (2 * l + r) / 3;
    int mid2 = (2 * r + l) / 3;
    if (f1(mid1, z) > f1(mid2, z)) {
      r = mid2;
    } else {
      l = mid1;
    }
  }
  while (l <= r) {
    ans = max(ans, f1(l, z));
    l++;
  }
  return ans;
}
int main() {
  std::ios::sync_with_stdio(false);
  int n, w, c, i, j;
  long long res = -100;
  cin >> n >> m;
  for (i = 0; i < n; i++) {
    cin >> w >> c;
    w--;
    v[w].push_back(c);
  }
  for (i = 0; i < 3; i++) sort(v[i].rbegin(), v[i].rend());
  for (i = 0; i < 3; i++) {
    for (j = 0; j < v[i].size(); j++) {
      s[i][j] = j > 0 ? s[i][j - 1] + v[i][j] : v[i][j];
    }
  }
  for (i = 0; i <= v[2].size(); i++) {
    res = max(res, compute(i));
  }
  cout << res << endl;
}
