#include <bits/stdc++.h>
using namespace std;
const int N = 55;
const long long mod = 1e9 + 7;
long long dp1[2][N][2505], dp2[2][N][N][2505], dp3[N][N][N][3];
int a[3][N];
int cnt[3];
long long perm[N];
int main() {
  perm[0] = 1;
  for (int i = 1; i <= 50; i++) perm[i] = perm[i - 1] * i % mod;
  int n, t;
  long long ans;
  scanf("%d %d", &n, &t);
  for (int i = 1, x, y; i <= n; i++) {
    scanf("%d %d", &x, &y);
    y--;
    a[y][++cnt[y]] = x;
  }
  dp1[0][0][0] = 1;
  for (int i = 1, cur = 1, pre = 0; i <= cnt[0]; i++, swap(cur, pre)) {
    memset(dp1[cur], 0, sizeof(dp1[cur]));
    for (int j = 0; j <= i; j++) {
      for (int k = 0; k <= t; k++) {
        dp1[cur][j][k] = dp1[pre][j][k];
        if (j && k >= a[0][i]) {
          dp1[cur][j][k] += dp1[pre][j - 1][k - a[0][i]];
          dp1[cur][j][k] %= mod;
        }
      }
    }
  }
  dp2[0][0][0][0] = 1;
  for (int i = 1, cur = 1, pre = 0; i <= cnt[1]; i++, swap(cur, pre)) {
    memset(dp2[cur], 0, sizeof(dp2[cur]));
    for (int j = 0; j <= i; j++) {
      for (int k = 0; k <= t; k++) {
        dp2[cur][j][0][k] = dp2[pre][j][0][k];
        if (j && k >= a[1][i]) {
          dp2[cur][j][0][k] += dp2[pre][j - 1][0][k - a[1][i]];
          dp2[cur][j][0][k] %= mod;
        }
      }
    }
  }
  if (cnt[1] & 1) memcpy(dp2[0], dp2[1], sizeof(dp2[0]));
  for (int i = 1, cur = 1, pre = 0; i <= cnt[2]; i++, swap(cur, pre)) {
    memset(dp2[cur], 0, sizeof(dp2[cur]));
    for (int j = 0; j <= i; j++) {
      for (int k = 0; k <= t; k++) {
        for (int p = 0; p <= cnt[1]; p++) {
          dp2[cur][p][j][k] = dp2[pre][p][j][k];
          if (j && k >= a[2][i]) {
            dp2[cur][p][j][k] += dp2[pre][p][j - 1][k - a[2][i]];
            dp2[cur][p][j][k] %= mod;
          }
        }
      }
    }
  }
  dp3[1][0][0][0] = dp3[0][1][0][1] = dp3[0][0][1][2] = 1;
  for (int p = 2; p <= n; p++) {
    for (int i = 0; i <= p; i++) {
      for (int j = 0, k; i + j <= p; j++) {
        k = p - i - j;
        if (i) {
          dp3[i][j][k][0] += dp3[i - 1][j][k][1] + dp3[i - 1][j][k][2];
          dp3[i][j][k][0] %= mod;
        }
        if (j) {
          dp3[i][j][k][1] += dp3[i][j - 1][k][0] + dp3[i][j - 1][k][2];
          dp3[i][j][k][1] %= mod;
        }
        if (k) {
          dp3[i][j][k][2] += dp3[i][j][k - 1][0] + dp3[i][j][k - 1][1];
          dp3[i][j][k][2] %= mod;
        }
      }
    }
  }
  for (int i = 0; i <= cnt[0]; i++) {
    for (int j = 0; j <= cnt[1]; j++) {
      for (int k = 0; k <= cnt[2]; k++) {
        dp3[i][j][k][0] += dp3[i][j][k][1] + dp3[i][j][k][2];
        dp3[i][j][k][0] %= mod;
      }
    }
  }
  ans = 0;
  for (int p = 0, cur1 = cnt[0] & 1, cur2 = cnt[2] & 1; p <= cnt[0]; p++) {
    for (int i = 0; i <= cnt[1]; i++) {
      for (int j = 0; j <= cnt[2]; j++) {
        for (int k = 0, q; k <= t; k++) {
          q = t - k;
          if (!dp1[cur1][p][q] || !dp2[cur2][i][j][k]) continue;
          ans += dp1[cur1][p][q] * dp2[cur2][i][j][k] % mod * dp3[p][i][j][0] %
                 mod * perm[i] % mod * perm[j] % mod * perm[p] % mod;
          ans %= mod;
        }
      }
    }
  }
  printf("%I64d\n", ans);
  return 0;
}
