#include <bits/stdc++.h>
using namespace std;
int N, T;
int t[55], G[55];
int A[55][2505];
int BC[55][55][2505];
int Ways[55][55][55][3];
int Fact[55];
const int MOD = 1000000007;
inline int norm(int x) { return x >= MOD ? x - MOD : x; }
void Read() {
  scanf("%d%d", &N, &T);
  for (int i = 1; i <= N; i++) scanf("%d%d", &t[i], &G[i]);
}
void precalcA() {
  A[0][0] = 1;
  for (int i = 1; i <= N; i++) {
    if (G[i] > 1) continue;
    for (int j = N; j >= 0; j--)
      for (int k = T - t[i]; k >= 0; k--)
        A[j + 1][k + t[i]] = norm(A[j + 1][k + t[i]] + A[j][k]);
  }
}
void precalcBC() {
  BC[0][0][0] = 1;
  int sumMax = 0, cnt2Max = 0, cnt3Max = 0;
  for (int i = 1; i <= N; i++) {
    if (G[i] == 1) continue;
    sumMax += t[i];
    if (G[i] == 2)
      cnt2Max++;
    else
      cnt3Max++;
    for (int cnt2 = cnt2Max; cnt2 >= 0; cnt2--) {
      for (int cnt3 = cnt3Max; cnt3 >= 0; cnt3--) {
        for (int k = sumMax - t[i]; k >= 0; k--) {
          BC[cnt2 + (G[i] == 2)][cnt3 + (G[i] == 3)][k + t[i]] =
              norm(BC[cnt2 + (G[i] == 2)][cnt3 + (G[i] == 3)][k + t[i]] +
                   BC[cnt2][cnt3][k]);
        }
      }
    }
  }
}
void precalcWays() {
  Ways[1][0][0][0] = 1;
  Ways[0][1][0][1] = 1;
  Ways[0][0][1][2] = 1;
  for (int i = 0; i <= N; i++)
    for (int j = 0; j <= N; j++)
      for (int k = 0; k <= N - i - j; k++)
        for (int last = 0; last <= 2; last++) {
          if ((last == 0 && i == 0) || (last == 1 && j == 0) ||
              (last == 2 && k == 0))
            continue;
          if (i + j + k <= 1) continue;
          if (last == 0) {
            Ways[i][j][k][last] =
                norm(Ways[i - 1][j][k][1] + Ways[i - 1][j][k][2]);
          }
          if (last == 1) {
            Ways[i][j][k][last] =
                norm(Ways[i][j - 1][k][0] + Ways[i][j - 1][k][2]);
          }
          if (last == 2) {
            Ways[i][j][k][last] =
                norm(Ways[i][j][k - 1][0] + Ways[i][j][k - 1][1]);
          }
        }
}
void precalcFact() {
  Fact[0] = 1;
  for (int i = 1; i <= N; i++) Fact[i] = (1LL * Fact[i - 1] * i) % MOD;
}
void Solve() {
  int ans = 0;
  for (int cnt0 = 0; cnt0 <= N; cnt0++) {
    for (int cnt1 = 0; cnt1 <= N; cnt1++)
      for (int cnt2 = 0; cnt2 <= N - cnt0 - cnt1; cnt2++)
        for (int t0 = 0; t0 <= T; t0++) {
          int aux = (1LL * A[cnt0][t0] * BC[cnt1][cnt2][T - t0]) % MOD;
          int totalWays =
              norm(norm(Ways[cnt0][cnt1][cnt2][0] + Ways[cnt0][cnt1][cnt2][1]) +
                   Ways[cnt0][cnt1][cnt2][2]);
          if (aux == 0 || totalWays == 0) continue;
          aux = (1LL * aux * totalWays) % MOD;
          aux = (1LL * aux * Fact[cnt0]) % MOD;
          aux = (1LL * aux * Fact[cnt1]) % MOD;
          aux = (1LL * aux * Fact[cnt2]) % MOD;
          ans = norm(ans + aux);
        }
  }
  printf("%d\n", ans);
}
int main() {
  Read();
  precalcA();
  precalcBC();
  precalcFact();
  precalcWays();
  Solve();
  return 0;
}
