#include <bits/stdc++.h>
using namespace std;
using vec = vector<int>;
using ii = pair<int, int>;
using ll = long long;
const int MAX = 2e7;
ll F[51][51][51][3];
ll Q[MAX];
int n, T;
int C[4];
int A[4];
const int MOD = 1e9 + 7;
ii song[51];
inline int compress(int i, int j, int k, int sum) {
  return i * (A[2] + 1) * (A[3] + 1) * (T + 1) + j * (A[3] + 1) * (T + 1) +
         k * (T + 1) + sum;
}
inline ll prod(ll a, ll b) { return (a * b) % MOD; }
void inline increase(ll& a, ll b) { a = (a + b) % MOD; }
int main() {
  scanf("%d %d", &n, &T);
  for (int i = 0; i < n; i++) {
    scanf("%d %d", &song[i].second, &song[i].first);
    A[song[i].first]++;
  }
  int states = A[1] * A[2] * A[3] * T;
  Q[0] = 1;
  for (int i = 0; i < n; i++) {
    C[song[i].first]++;
    for (int q1 = C[1]; q1 >= 0; q1--) {
      for (int q2 = C[2]; q2 >= 0; q2--) {
        for (int q3 = C[3]; q3 >= 0; q3--) {
          if (song[i].first == 1) {
            if (q1 == 0) continue;
            for (int sum = T; sum >= song[i].second; sum--) {
              increase(Q[compress(q1, q2, q3, sum)],
                       Q[compress(q1 - 1, q2, q3, sum - song[i].second)]);
            }
          }
          if (song[i].first == 2) {
            if (q2 == 0) continue;
            for (int sum = T; sum >= song[i].second; sum--) {
              increase(Q[compress(q1, q2, q3, sum)],
                       Q[compress(q1, q2 - 1, q3, sum - song[i].second)]);
            }
          }
          if (song[i].first == 3) {
            if (q3 == 0) continue;
            for (int sum = T; sum >= song[i].second; sum--) {
              increase(Q[compress(q1, q2, q3, sum)],
                       Q[compress(q1, q2, q3 - 1, sum - song[i].second)]);
            }
          }
        }
      }
    }
  }
  F[1][0][0][1] = 1;
  F[0][1][0][2] = 1;
  F[0][0][1][3] = 1;
  int temp[4];
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      for (int k = 0; k < n; k++) {
        if (i + j + k <= 1) continue;
        temp[1] = i;
        temp[2] = j;
        temp[3] = k;
        for (int t = 1; t <= 3; t++) {
          if (temp[t] == 0) continue;
          temp[t]--;
          for (int end = 1; end <= 3; end++) {
            if (end == t) continue;
            F[i][j][k][t] =
                (F[i][j][k][t] +
                 prod((temp[t] + 1), F[temp[1]][temp[2]][temp[3]][end])) %
                MOD;
          }
          temp[t]++;
        }
      }
    }
  }
  ll res = 0;
  for (int i = 0; i <= A[1]; i++) {
    for (int j = 0; j <= A[2]; j++) {
      for (int k = 0; k <= A[3]; k++) {
        for (int t = 1; t <= 3; t++) {
          res = (res + Q[compress(i, j, k, T)] * F[i][j][k][t]) % MOD;
        }
      }
    }
  }
  printf("%lld\n", res);
}
