#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
const int sz2 = 5e5 + 1;
int fact[sz2];
int inv_fact[sz2];
int mul(int a, int b) { return (long long)a * b % mod; }
int add(int a, int b) {
  int res = (long long)a + b;
  if (res < 0)
    res += mod;
  else if (res > mod)
    res -= mod;
  return res;
}
int bpow(int x, int p) {
  int res = 1;
  while (p) {
    if (p & 1) res = mul(res, x);
    p >>= 1;
    if (p) x = mul(x, x);
  }
  return res;
}
int inv(int x) { return bpow(x, mod - 2); }
void calc_fact() {
  fact[0] = inv_fact[0] = 1;
  for (int i = 1; i < sz2; i++) {
    fact[i] = mul(fact[i - 1], i);
    inv_fact[i] = inv(fact[i]);
  }
}
int cnk(int n, int k) {
  if (k > n) return 0;
  return mul(fact[n], mul(inv_fact[k], inv_fact[n - k]));
}
const int sz = 55;
int dp[sz * sz][sz][sz];
int dp1[sz * sz][sz];
int dp2[sz][sz][sz][sz][3];
void solve() {
  int n, t;
  cin >> n >> t;
  vector<pair<int, int>> a(n);
  for (int i = 0; i < n; i++) {
    cin >> a[i].first >> a[i].second;
    a[i].second--;
  }
  dp[0][0][0] = 1;
  dp1[0][0] = 1;
  for (int i = 0; i < n; i++) {
    if (a[i].second <= 1) {
      for (int j = t; j >= 0; j--) {
        for (int k = 0; k < n; k++) {
          for (int l = 0; l < n; l++) {
            if (j + a[i].first <= t)
              dp[j + a[i].first][k + (a[i].second == 0)]
                [l + (a[i].second == 1)] =
                    add(dp[j + a[i].first][k + (a[i].second == 0)]
                          [l + (a[i].second == 1)],
                        dp[j][k][l]);
          }
        }
      }
    } else {
      for (int j = t; j >= 0; j--) {
        for (int k = 0; k < n; k++) {
          if (j + a[i].first <= t)
            dp1[j + a[i].first][k + 1] =
                add(dp1[j + a[i].first][k + 1], dp1[j][k]);
        }
      }
    }
  }
  dp2[1][1][0][0][0] = 1;
  dp2[1][0][1][0][1] = 1;
  dp2[1][0][0][1][2] = 1;
  for (int i = 1; i < n; i++) {
    for (int j = 0; j <= n; j++) {
      for (int k = 0; k <= n; k++) {
        for (int l = 0; l <= n; l++) {
          for (int h = 0; h < 3; h++) {
            for (int g = 0; g < 3; g++) {
              if (g != h)
                dp2[i + 1][j + (g == 0)][k + (g == 1)][l + (g == 2)][g] =
                    add(dp2[i + 1][j + (g == 0)][k + (g == 1)][l + (g == 2)][g],
                        dp2[i][j][k][l][h]);
            }
          }
        }
      }
    }
  }
  int ans = 0;
  for (int i = 0; i <= t; i++) {
    for (int j = 0; j <= n; j++) {
      for (int k = 0; k <= n; k++) {
        for (int l = 0; l <= n; l++) {
          if (j + k + l > n) continue;
          int p = mul(
              mul(dp[i][j][k], dp1[t - i][l]),
              add(dp2[j + k + l][j][k][l][0],
                  add(dp2[j + k + l][j][k][l][1], dp2[j + k + l][j][k][l][2])));
          int r = mul(fact[j], mul(fact[k], fact[l]));
          ans = add(ans, mul(p, r));
        }
      }
    }
  }
  cout << ans;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  calc_fact();
  int q = 1;
  for (; q > 0; q--) {
    solve();
  }
}
