#include <bits/stdc++.h>
using namespace std;
long long dp[16][16][16][4];
long long frac[16], t[16], g[16];
long long DP(int x, int y, int z, int m) {
  if (x < 0 || y < 0 || z < 0) return 0;
  if (m == 1 && x == 0) return 0;
  if (m == 2 && y == 0) return 0;
  if (m == 3 && z == 0) return 0;
  if (x == 1 && y == 0 && z == 0 && m == 1) return 1;
  if (x == 0 && y == 1 && z == 0 && m == 2) return 1;
  if (x == 0 && y == 0 && z == 1 && m == 3) return 1;
  if (dp[x][y][z][m] != -1) return dp[x][y][z][m];
  if (m == 1)
    dp[x][y][z][m] = (DP(x - 1, y, z, 2) + DP(x - 1, y, z, 3)) % 1000000007;
  if (m == 2)
    dp[x][y][z][m] = (DP(x, y - 1, z, 1) + DP(x, y - 1, z, 3)) % 1000000007;
  if (m == 3)
    dp[x][y][z][m] = (DP(x, y, z - 1, 1) + DP(x, y, z - 1, 2)) % 1000000007;
  return dp[x][y][z][m];
}
int main() {
  cin.tie(0);
  ios_base::sync_with_stdio(0);
  frac[0] = 1;
  for (int i = 1; i <= 15; i++) frac[i] = frac[i - 1] * i % 1000000007;
  for (int i = 0; i < 16; i++)
    for (int j = 0; j < 16; j++)
      for (int k = 0; k < 16; k++)
        for (int p = 0; p < 4; p++) dp[i][j][k][p] = -1;
  int n, T;
  cin >> n >> T;
  for (int i = 0; i < n; i++) {
    cin >> t[i] >> g[i];
  }
  long long ans = 0;
  for (int i = 0; i < (1 << n); i++) {
    int sum = 0;
    int h[4] = {0, 0, 0, 0};
    for (int j = 0; j < n; j++) {
      if (i & (1 << j)) {
        sum += t[j];
        h[g[j]]++;
      }
    }
    if (sum != T) continue;
    ans += (((DP(h[1], h[2], h[3], 1) + DP(h[1], h[2], h[3], 2)) % 1000000007 +
             DP(h[1], h[2], h[3], 3)) %
            1000000007) *
           frac[h[1]] % 1000000007 * frac[h[2]] % 1000000007 * frac[h[3]] %
           1000000007;
    ans %= 1000000007;
  }
  cout << ans << '\n';
  return 0;
}
