#include <bits/stdc++.h>
using namespace std;
long long t[55], g[55], fat[55], n, k;
long long a[55][2505], bc[55][55][2505];
long long ways[55][55][55][5];
vector<long long> adj[5];
long long mod = 1e9 + 7;
int main() {
  cin >> n >> k;
  for (long long i = 0; i < 3; i++) adj[i].push_back(0);
  for (long long i = 1; i <= n; i++) {
    cin >> t[i] >> g[i];
    g[i]--;
    adj[g[i]].push_back(t[i]);
  }
  a[0][0] = 1;
  for (long long i = 1; i < adj[0].size(); i++)
    for (long long l = i - 1; l >= 0; l--)
      for (long long j = 0; j <= k; j++)
        if (j + adj[0][i] <= k) {
          a[l + 1][j + adj[0][i]] += a[l][j];
          a[l + 1][j + adj[0][i]] %= mod;
        }
  vector<long long> c(3, 0);
  bc[0][0][0] = 1;
  for (long long pos = 0; pos <= n; pos++) {
    if (g[pos] == 0) continue;
    for (long long i = c[1]; i >= 0; i--)
      for (long long j = c[2]; j >= 0; j--)
        for (long long l = 0; l + t[pos] <= k; l++) {
          if (g[pos] == 1)
            bc[i + 1][j][l + t[pos]] += bc[i][j][l];
          else
            bc[i][j + 1][l + t[pos]] += bc[i][j][l];
          bc[i + 1][j][l + t[pos]] %= mod;
        }
    c[g[pos]]++;
  }
  ways[0][0][0][3] = 1;
  c.assign(3, 0);
  for (c[0] = 0; c[0] < adj[0].size(); c[0]++)
    for (c[1] = 0; c[1] < adj[1].size(); c[1]++)
      for (c[2] = 0; c[2] < adj[2].size(); c[2]++)
        for (long long last = 0; last < 4; last++)
          if (ways[c[0]][c[1]][c[2]][last])
            for (long long next = 0; next < 3; next++)
              if (next != last and c[next] + 1 < adj[next].size()) {
                vector<long long> aux(c);
                aux[next]++;
                ways[aux[0]][aux[1]][aux[2]][next] +=
                    ways[c[0]][c[1]][c[2]][last];
                ways[aux[0]][aux[1]][aux[2]][next] %= mod;
              }
  fat[0] = 1;
  fat[1] = 1;
  for (long long i = 2; i <= n; i++) fat[i] = (fat[i - 1] * i) % mod;
  long long res = 0;
  for (c[0] = 0; c[0] < adj[0].size(); c[0]++)
    for (c[1] = 0; c[1] < adj[1].size(); c[1]++)
      for (c[2] = 0; c[2] < adj[2].size(); c[2]++)
        for (long long dur = 0; dur <= k; dur++) {
          long long aux = (a[c[0]][dur] * bc[c[1]][c[2]][k - dur]) % mod;
          for (long long i = 0; i < 3; i++) aux = (aux * fat[c[i]]) % mod;
          for (long long last = 0; last < 3; last++)
            if (c[last] > 0)
              res = (res + (aux * ways[c[0]][c[1]][c[2]][last]) % mod) % mod;
        }
  cout << res << endl;
  return 0;
}
