#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
int f[55][55][2550], g[55][2550], a[55], b[55], cnt[10], pre[55][4],
    tot[55][55][55], tp[155], tmp[155];
int fac[55], inv[55], C[55][55];
inline int add(int a, int b) { return a + b >= mod ? a + b - mod : a + b; }
inline int dic(int a, int b) { return a - b < 0 ? a - b + mod : a - b; }
inline int mul(int a, int b) { return 1ll * a * b % mod; }
inline int qpow(int a, int b, int c = 1) {
  for (; b; b >>= 1, a = mul(a, a))
    if (b & 1) c = mul(c, a);
  return c;
}
int main() {
  int n, T, ans = 0;
  cin >> n >> T;
  for (int i = fac[0] = inv[0] = 1; i <= n; ++i) {
    scanf("%d%d", &a[i], &b[i]);
    for (int j = 1; j <= 3; ++j) pre[i][j] = pre[i - 1][j] + (b[i] == j);
    fac[i] = mul(fac[i - 1], i);
    inv[i] = qpow(fac[i], mod - 2);
  }
  for (int i = C[0][0] = 1; i <= n; ++i)
    for (int j = C[i][0] = 1; j <= i; ++j)
      C[i][j] = add(C[i - 1][j], C[i - 1][j - 1]);
  f[0][0][0] = 1, g[0][0] = 1;
  for (int i = 1; i <= n; ++i)
    if (b[i] <= 2)
      for (int j = pre[i][1]; j >= (b[i] == 1); --j)
        for (int k = pre[i][2]; k >= (b[i] == 2); --k)
          for (int l = T; l >= a[i]; --l)
            f[j][k][l] =
                add(f[j][k][l], f[j - (b[i] == 1)][k - (b[i] == 2)][l - a[i]]);
  for (int i = 1; i <= n; ++i)
    if (b[i] == 3)
      for (int j = pre[i][3]; j; --j)
        for (int k = T; k >= a[i]; --k)
          g[j][k] = add(g[j][k], g[j - 1][k - a[i]]);
  for (int a = 0; a <= pre[n][1]; ++a)
    for (int b = 0; b <= pre[n][2]; ++b)
      for (int c = 0; c <= pre[n][3]; ++c)
        for (int d = 0; d <= T; ++d)
          tot[a][b][c] = add(tot[a][b][c], mul(f[a][b][d], g[c][T - d]));
  for (int a = 0; a <= pre[n][1]; ++a)
    for (int b = 0; b <= pre[n][2]; ++b)
      for (int c = 0; c <= pre[n][3]; ++c)
        if (tot[a][b][c]) {
          int res = 0;
          tp[0] = tmp[0] = 1;
          if (a) {
            for (int i = 0; i <= a; ++i) tmp[i] = 0;
            for (int i = 1; i <= a; ++i)
              if ((a - i) & 1)
                tmp[i] = dic(tmp[i], mul(C[a - 1][a - i], inv[i]));
              else
                tmp[i] = add(tmp[i], mul(C[a - 1][a - i], inv[i]));
            for (int i = 0; i <= a; ++i) tp[i] = 0;
          }
          if (b) {
            for (int i = 0; i <= a + b; ++i) tp[i] = tmp[i], tmp[i] = 0;
            for (int i = 0; i <= a; ++i)
              for (int j = 1; j <= b; ++j)
                if ((b - j) & 1)
                  tmp[i + j] =
                      dic(tmp[i + j], mul(C[b - 1][b - j], mul(inv[j], tp[i])));
                else
                  tmp[i + j] =
                      add(tmp[i + j], mul(C[b - 1][b - j], mul(inv[j], tp[i])));
            for (int i = 0; i <= a + b; ++i) tp[i] = 0;
          }
          if (c) {
            for (int i = 0; i <= a + b + c; ++i) tp[i] = tmp[i], tmp[i] = 0;
            for (int i = 0; i <= a + b; ++i)
              for (int j = 1; j <= c; ++j)
                if ((c - j) & 1)
                  tmp[i + j] =
                      dic(tmp[i + j], mul(C[c - 1][c - j], mul(inv[j], tp[i])));
                else
                  tmp[i + j] =
                      add(tmp[i + j], mul(C[c - 1][c - j], mul(inv[j], tp[i])));
            for (int i = 0; i <= a + b + c; ++i) tp[i] = 0;
          }
          for (int i = 0; i <= a + b + c; ++i)
            res = add(res, mul(tmp[i], fac[i]));
          ans = add(ans, mul(res, mul(tot[a][b][c],
                                      mul(fac[a], mul(fac[b], fac[c])))));
        }
  cout << ans << endl;
  return 0;
}
