#include <bits/stdc++.h>
using namespace std;
const int N = 55, W = 2505, MOD = 1e9 + 7;
int type[N], duration[N], n;
int a[N][W], bc[N][N][W], Cnt[4], Ways[N][N][N][4], fac[N];
void add(int &a, int b) { a = (a + b) % MOD; }
void mult(int &a, int b) { a = 1LL * a * b % MOD; }
int main(int argc, char const *argv[]) {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  clock_t tStart = clock();
  fac[0] = 1;
  for (int i = (1), _b = (N - 3); i <= _b; i++) {
    fac[i] = fac[i - 1];
    mult(fac[i], i);
  }
  int T;
  cin >> n >> T;
  for (int i = (1), _b = (n); i <= _b; i++) cin >> duration[i] >> type[i];
  a[0][0] = 1;
  for (int i = (1), _b = (n); i <= _b; i++) {
    Cnt[type[i]]++;
    if (type[i] != 1) continue;
    for (int cc = (Cnt[1]), _a = (0); cc >= _a; cc--)
      for (int j = (T), _a = (0); j >= _a; j--) {
        if (j >= duration[i]) {
          add(a[cc][j], a[cc - 1][j - duration[i]]);
        }
      }
  }
  bc[0][0][0] = 1;
  for (int i = (1), _b = (n); i <= _b; i++) {
    for (int b = (Cnt[2]), _a = (0); b >= _a; b--) {
      for (int c = (Cnt[3]), _a = (0); c >= _a; c--) {
        for (int j = (T), _a = (0); j >= _a; j--)
          if (duration[i] <= j) {
            if (type[i] == 2) {
              add(bc[b][c][j], bc[b - 1][c][j - duration[i]]);
            } else if (type[i] == 3)
              add(bc[b][c][j], bc[b][c - 1][j - duration[i]]);
          }
      }
    }
  }
  vector<int> c(4);
  if (Cnt[1]) Ways[1][0][0][1] = 1;
  if (Cnt[2]) Ways[0][1][0][2] = 1;
  if (Cnt[3]) Ways[0][0][1][3] = 1;
  for (c[1] = 0; c[1] <= Cnt[1]; ++c[1])
    for (c[2] = 0; c[2] <= Cnt[2]; ++c[2])
      for (c[3] = 0; c[3] <= Cnt[3]; ++c[3])
        for (int lst = (1), _b = (3); lst <= _b; lst++) {
          if (c[1] + c[2] + c[3] == 0) continue;
          if (c[lst] == 0) continue;
          int tmp = Ways[c[1]][c[2]][c[3]][lst];
          for (int nxt = (1), _b = (3); nxt <= _b; nxt++)
            if (nxt != lst) {
              c[nxt]++;
              add(Ways[c[1]][c[2]][c[3]][nxt], tmp);
              c[nxt]--;
            }
        }
  int res = 0;
  for (c[1] = 0; c[1] <= Cnt[1]; ++c[1])
    for (int j = (0), _b = (T); j <= _b; j++) {
      for (c[2] = 0; c[2] <= Cnt[2]; ++c[2])
        for (c[3] = 0; c[3] <= Cnt[3]; ++c[3]) {
          int tmp = a[c[1]][j];
          mult(tmp, bc[c[2]][c[3]][T - j]);
          mult(tmp, fac[c[1]]);
          mult(tmp, fac[c[2]]);
          mult(tmp, fac[c[3]]);
          int tt = 0;
          for (int t = (1), _b = (3); t <= _b; t++)
            add(tt, Ways[c[1]][c[2]][c[3]][t]);
          mult(tmp, tt);
          add(res, tmp);
        }
    }
  cout << res << '\n';
  fprintf(stderr, "Time taken: %.2fs\n",
          (double)(clock() - tStart) / CLOCKS_PER_SEC);
  return 0;
}
