#include <bits/stdc++.h>
using namespace std;
const int mn = 55;
const int mm = 2505;
const int mod = 1000000007;
int n, m, T;
int t[mm], g[mm];
int a[mn][mm];
int bc[mn][mn][mm];
int way[mn][mn][mn][3];
int cnt[3];
void init_a() {
  memset(a, -2, sizeof a);
  a[0][0] = 1;
  for (int k = 1; k <= n; k++) {
    if (g[k]) continue;
    for (int i = cnt[0]; i >= 0; i--) {
      for (int j = T - t[k]; j >= 0; j--) {
        if (a[i][j] <= 0) continue;
        int &ans = a[i + 1][j + t[k]];
        if (ans < 0) ans = 0;
        ans += a[i][j];
        if (ans >= mod) ans -= mod;
      }
    }
    cnt[0]++;
  }
}
void init_bc() {
  memset(bc, -2, sizeof bc);
  bc[0][0][0] = 1;
  for (int k = 1; k <= n; k++) {
    if (!g[k]) continue;
    for (int i = cnt[1]; i >= 0; i--) {
      for (int j = cnt[2]; j >= 0; j--) {
        for (int l = T - t[k]; l >= 0; l--) {
          if (bc[i][j][l] <= 0) continue;
          int &ans = bc[i + (g[k] == 1)][j + (g[k] == 2)][l + t[k]];
          if (ans < 0) ans = 0;
          ans += bc[i][j][l];
          if (ans >= mod) ans -= mod;
        }
      }
    }
    if (g[k] == 1)
      cnt[1]++;
    else
      cnt[2]++;
  }
}
void inc(int &a, int b) {
  if (a < 0) a = 0;
  a += b;
  if (a >= mod) a -= mod;
}
void init_way() {
  memset(way, -2, sizeof(way));
  way[1][0][0][0] = way[0][1][0][1] = way[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 last = 0; last < 3; last++) {
          for (int nxt = 0; nxt < 3; nxt++) {
            if (nxt == last || way[i][j][k][last] <= 0) continue;
            int uans = way[i][j][k][last];
            if (nxt == 0)
              inc(way[i + 1][j][k][0], uans);
            else if (nxt == 1)
              inc(way[i][j + 1][k][1], uans);
            else
              inc(way[i][j][k + 1][2], uans);
          }
        }
      }
    }
  }
}
inline int getway(int i, int j, int k) {
  int ans = 0;
  for (int last = 0; last < 3; last++) {
    if (way[i][j][k][last] <= 0) continue;
    inc(ans, way[i][j][k][last]);
  }
  return ans;
}
int fact[105];
int main() {
  scanf("%d%d", &n, &T);
  for (int i = 1; i <= n; i++) scanf("%d%d", &t[i], &g[i]), g[i]--;
  fact[0] = 1;
  for (int i = 1; i <= 55; i++) fact[i] = (long long)fact[i - 1] * i % mod;
  init_a();
  init_bc();
  init_way();
  long long ans = 0;
  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 t = 0; t <= T; t++) {
          if (a[i][t] <= 0 || bc[j][k][T - t] <= 0) continue;
          ans = (ans + (long long)a[i][t] * bc[j][k][T - t] % mod *
                           getway(i, j, k) % mod * fact[i] % mod * fact[j] %
                           mod * fact[k]) %
                mod;
        }
      }
    }
  }
  printf("%lld\n", ans);
  return 0;
}
