#include <bits/stdc++.h>
using namespace std;
const int maxn = 50 + 2;
const int maxT = 2500 + 2;
const int MOD = 1000000007;
inline int inc(int a, int b) {
  return (a + b >= MOD) ? (a + b - MOD) : (a + b);
}
inline int dec(int a, int b) { return (a >= b) ? (a - b) : (a + MOD - b); }
inline int mul(int a, int b) { return 1LL * a * b % MOD; }
inline int power(int x, int k) {
  int tmp = 1;
  while (k) {
    if (k & 1) tmp = mul(tmp, x);
    x = mul(x, x);
    k >>= 1;
  }
  return tmp;
}
inline void updata(int &x, int y) { x = inc(x, y); }
int n, T, cnt[3], fac[maxn];
struct data {
  int t, g;
  data() {}
  data(int _t, int _g) : t(_t), g(_g) {}
} val[maxn];
int a[maxn][maxT], bc[maxn][maxn][maxT], f[maxn][maxn][maxn][3], ta[maxn][maxT],
    tbc[maxn][maxn][maxT];
int main() {
  scanf("%d%d", &n, &T);
  cnt[0] = cnt[1] = cnt[2] = 0;
  for (int i = 1; i <= n; i++) {
    int t, g;
    scanf("%d%d", &t, &g);
    g--;
    val[i] = data(t, g);
    cnt[g]++;
  }
  a[0][0] = 1;
  bc[0][0][0] = 1;
  for (int i = 1; i <= n; i++) {
    int t = val[i].t, g = val[i].g;
    if (!g) {
      for (int j = i; j >= 1; j--) {
        for (int k = T; k >= t; k--) updata(a[j][k], a[j - 1][k - t]);
      }
    } else {
      int db = 0, dc = 0;
      if (g == 1) db++;
      if (g == 2) dc++;
      for (int j = i; j >= db; j--) {
        for (int k = i; k >= dc; k--) {
          for (int l = T; l >= t; l--)
            updata(bc[j][k][l], bc[j - db][k - dc][l - t]);
        }
      }
    }
  }
  fac[0] = 1;
  for (int i = 1; i <= n; i++) fac[i] = mul(fac[i - 1], i);
  if (cnt[0]) f[1][0][0][0] = 1;
  if (cnt[1]) f[0][1][0][1] = 1;
  if (cnt[2]) f[0][0][1][2] = 1;
  for (int i = 0; i <= cnt[0]; i++) {
    for (int j = 0; j <= cnt[1]; j++) {
      for (int k = 0; k <= cnt[2]; k++) {
        for (int l = 0; l < 3; l++) {
          if (!f[i][j][k][l]) continue;
          if (i < cnt[0] && l != 0) updata(f[i + 1][j][k][0], f[i][j][k][l]);
          if (j < cnt[1] && l != 1) updata(f[i][j + 1][k][1], f[i][j][k][l]);
          if (k < cnt[2] && l != 2) updata(f[i][j][k + 1][2], f[i][j][k][l]);
        }
      }
    }
  }
  int Ans = 0;
  for (int i = 0; i <= cnt[0]; i++) {
    for (int l = 0; l <= T; l++) {
      if (!a[i][l]) continue;
      for (int j = 0; j <= cnt[1]; j++) {
        for (int k = 0; k <= cnt[2]; k++) {
          int xs = inc(f[i][j][k][0], inc(f[i][j][k][1], f[i][j][k][2]));
          xs = mul(xs, mul(fac[i], mul(fac[j], fac[k])));
          int now = mul(mul(a[i][l], bc[j][k][T - l]), xs);
          Ans = inc(Ans, now);
        }
      }
    }
  }
  printf("%d\n", Ans);
  return 0;
}
