#include <bits/stdc++.h>
using namespace std;
struct triple {
  int t[3] = {0, 0, 0};
  long long sum = 0;
};
long long val[4][100010];
int cnt[4];
triple dp[300010];
void calc_dp(int x);
int main() {
  int n, m;
  cin >> n >> m;
  while (n--) {
    int c, w;
    cin >> w >> c;
    val[w][cnt[w]++] = c;
  }
  for (int i(1); i <= 3; i++)
    sort(val[i], val[i] + cnt[i], [](int a, int b) { return a > b; });
  long long ans(0);
  for (int i(1); i <= m; i++) {
    calc_dp(i);
    ans = max(ans, dp[i].sum);
  }
  long long sp(0);
  for (int i(1); 3 * i <= m && i <= cnt[3]; i++) {
    sp += val[3][i - 1];
    ans = max(ans, sp + dp[m - 3 * i].sum);
  }
  cout << ans;
  return 0;
}
void calc_dp(int x) {
  dp[x] = dp[x - 1];
  for (int i(1); i <= 2; i++) {
    if (x - i >= 0 && dp[x - i].t[i] < cnt[i] &&
        dp[x - i].sum + val[i][dp[x - i].t[i]] > dp[x].sum) {
      dp[x] = dp[x - i];
      dp[x].sum += val[i][dp[x].t[i]];
      dp[x].t[i]++;
    }
  }
}
