#include <bits/stdc++.h>
using namespace std;
long long read() {
  int f = 1;
  long long res = 0;
  char ch;
  do {
    ch = getchar();
    if (ch == '-') f = -f;
  } while (ch < '0' || ch > '9');
  do {
    res = res * 10 + ch - '0';
    ch = getchar();
  } while (ch >= '0' && ch <= '9');
  return f == 1 ? res : -res;
}
void fast_io() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
}
const int N = 55;
const int M = 3010;
const int mod = 1e9 + 7;
const long long INF = 1e18;
int n, m;
int A[N], B[N];
char str[N];
int head[N], to[N * 2], nxt[N * 2], tot;
void addEdge(int u, int v) {
  tot++;
  nxt[tot] = head[u];
  to[tot] = v;
  head[u] = tot;
}
template <class T>
T mmax(T a, T b) {
  return a < b ? b : a;
}
template <class T>
T mmin(T a, T b) {
  return a < b ? a : b;
}
int countOne(long long set) {
  int res = 0;
  while (set) {
    res++;
    set &= set - 1;
  }
  return res;
}
bool contain(long long set, int i) { return (set & (1LL << i)) > 0; }
long long myPow(long long a, long long p) {
  if (p == 0) return 1;
  long long res = myPow(a, p / 2);
  res *= res;
  res %= mod;
  if (p % 2 == 1) {
    res *= a;
    res %= mod;
  }
  return res % mod;
}
void addMode(long long &a, long long b) { a = (a + b) % mod; }
long long mul(long long a, long long b) { return a * b % mod; }
template <class T>
void mySwap(T &a, T &b) {
  T tmp = a;
  a = b;
  b = tmp;
}
long long a[N][M];
long long bc[N][N][M];
long long ways[N][N][N][4];
long long f[N];
int cnt[3];
int dis[2];
int main() {
  fast_io();
  int T;
  cin >> n >> T;
  f[0] = f[1] = 1;
  for (int i = 2; i <= n; i++) f[i] = mul(f[i - 1], i);
  a[0][0] = bc[0][0][0] = 1;
  for (int i = 0; i < n; i++) {
    int t, g;
    cin >> t >> g;
    g--;
    if (g == 0) {
      for (int j = cnt[0]; j >= 0; j--)
        for (int len = dis[0]; len >= 0; len--) {
          addMode(a[j + 1][len + t], a[j][len]);
        }
      cnt[0]++;
      dis[0] += t;
    } else {
      for (int j = cnt[1]; j >= 0; j--)
        for (int k = cnt[2]; k >= 0; k--)
          for (int len = dis[1]; len >= 0; len--) {
            addMode(bc[j + (g == 1)][k + (g == 2)][len + t], bc[j][k][len]);
          }
      cnt[g]++;
      dis[1] += t;
    }
  }
  ways[0][0][0][3] = 1;
  vector<int> c(3);
  for (c[0] = 0; c[0] <= cnt[0]; c[0]++)
    for (c[1] = 0; c[1] <= cnt[1]; c[1]++)
      for (c[2] = 0; c[2] <= cnt[2]; c[2]++)
        for (int t = 0; t < 4; t++)
          if (ways[c[0]][c[1]][c[2]][t]) {
            for (int g = 0; g < 3; g++)
              if (g != t && c[g] + 1 <= cnt[g]) {
                vector<int> cn(c);
                cn[g]++;
                addMode(ways[cn[0]][cn[1]][cn[2]][g],
                        ways[c[0]][c[1]][c[2]][t]);
              }
          }
  long long res = 0;
  for (c[0] = 0; c[0] <= cnt[0]; c[0]++)
    for (int d0 = 0; d0 <= dis[0]; d0++)
      if (T - d0 >= 0) {
        for (c[1] = 0; c[1] <= cnt[1]; c[1]++)
          for (c[2] = 0; c[2] <= cnt[2]; c[2]++)
            if (bc[c[1]][c[2]][T - d0]) {
              long long extra = a[c[0]][d0] * bc[c[1]][c[2]][T - d0] % mod;
              for (int i = 0; i < 3; i++) extra = mul(extra, f[c[i]]);
              for (int i = 0; i < 3; i++)
                if (c[i]) {
                  addMode(res, extra * ways[c[0]][c[1]][c[2]][i] % mod);
                }
            }
      }
  cout << res << endl;
  return 0;
}
