#include <bits/stdc++.h>
using namespace std;
const long long md = 1e9 + 7;
int dp0[51][2555] = {1}, dp12[51][51][2555] = {1};
int fac[51] = {1}, n, dp[51][51][51][4];
vector<int> songs[3];
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  for (int i = 1; i < 51; ++i) fac[i] = (i * 1ll * fac[i - 1]) % md;
  int T;
  cin >> n >> T;
  int sum[3] = {};
  for (int i = 0, s, g; i < n; ++i) {
    cin >> s >> g;
    --g;
    if (!g)
      for (int i = songs[0].size(); i >= 0; --i)
        for (int len = 0; len <= sum[0]; ++len)
          (dp0[i + 1][len + s] += dp0[i][len]) %= md;
    else
      for (int i = songs[1].size(); i >= 0; --i)
        for (int j = songs[2].size(); j >= 0; --j)
          for (int len = 0; len <= sum[1] + sum[2]; ++len)
            (dp12[i + (g == 1)][j + (g == 2)][len + s] += dp12[i][j][len]) %=
                md;
    songs[g].push_back(s);
    sum[g] += s;
  }
  dp[0][0][0][3] = 1;
  for (int i = 0; i <= songs[0].size(); ++i)
    for (int j = 0; j <= songs[1].size(); ++j)
      for (int k = 0; k <= songs[2].size(); ++k)
        for (int last = 0; last < 4; ++last)
          for (int now = 0; now < 3; ++now)
            if (now != last) {
              (dp[i + (now == 0)][j + (now == 1)][k + (now == 2)][now] +=
               dp[i][j][k][last]) %= md;
            }
  long long ans = 0;
  for (int i = 0; i <= songs[0].size(); ++i)
    for (int len = 0; len <= sum[0]; ++len)
      for (int j = 0; j <= songs[1].size(); ++j)
        for (int k = 0; k <= songs[2].size(); ++k) {
          long long now = (long long)dp0[i][len] * dp12[j][k][T - len] % md;
          long long fact = (long long)fac[i] * fac[j] % md * fac[k] % md;
          long long ways =
              (long long)dp[i][j][k][0] + dp[i][j][k][1] + dp[i][j][k][2];
          (ans += fact * ways % md * now) %= md;
        }
  cout << ans;
}
