#include <bits/stdc++.h>
using namespace std;
const int MAX = (1 << 25);
int n, t;
long long dp[51][51][51][4];
pair<short, short> arr[51];
vector<int> ans1[2501], ans2[2501];
long long solve(short ind, short r, short g, short last) {
  if (ind == 0) return 1;
  if (dp[ind][r][g][last] != -1) return dp[ind][r][g][last];
  dp[ind][r][g][last] = 0;
  if (last == 0) {
    if (r) {
      long long val = r * solve(ind - 1, r - 1, g, 1);
      val %= 1000000007;
      dp[ind][r][g][last] += val;
    }
    dp[ind][r][g][last] %= 1000000007;
    if (g) {
      long long val = g * solve(ind - 1, r, g - 1, 2);
      val %= 1000000007;
      dp[ind][r][g][last] += val;
    }
    dp[ind][r][g][last] %= 1000000007;
    if (ind - r - g) {
      long long val = (ind - r - g) * solve(ind - 1, r, g, 3);
      val %= 1000000007;
      dp[ind][r][g][last] += val;
    }
    dp[ind][r][g][last] %= 1000000007;
  } else if (last == 1) {
    if (g) {
      long long val = g * solve(ind - 1, r, g - 1, 2);
      val %= 1000000007;
      dp[ind][r][g][last] += val;
    }
    dp[ind][r][g][last] %= 1000000007;
    if (ind - r - g) {
      long long val = (ind - r - g) * solve(ind - 1, r, g, 3);
      val %= 1000000007;
      dp[ind][r][g][last] += val;
    }
    dp[ind][r][g][last] %= 1000000007;
  } else if (last == 2) {
    if (r) {
      long long val = r * solve(ind - 1, r - 1, g, 1);
      val %= 1000000007;
      dp[ind][r][g][last] += val;
    }
    dp[ind][r][g][last] %= 1000000007;
    if (ind - r - g) {
      long long val = (ind - r - g) * solve(ind - 1, r, g, 3);
      val %= 1000000007;
      dp[ind][r][g][last] += val;
    }
    dp[ind][r][g][last] %= 1000000007;
  } else {
    if (r) {
      long long val = r * solve(ind - 1, r - 1, g, 1);
      val %= 1000000007;
      dp[ind][r][g][last] += val;
    }
    dp[ind][r][g][last] %= 1000000007;
    if (g) {
      long long val = g * solve(ind - 1, r, g - 1, 2);
      val %= 1000000007;
      dp[ind][r][g][last] += val;
    }
    dp[ind][r][g][last] %= 1000000007;
  }
  return dp[ind][r][g][last];
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> t;
  memset(dp, -1, sizeof(dp));
  for (int i = int(1); i <= int(n); i++) cin >> arr[i].first >> arr[i].second;
  if (n == 1) {
    if (arr[1].first == t)
      cout << 1;
    else
      cout << 0;
    return 0;
  }
  int sz1 = n / 2;
  int sz2 = (n - n / 2);
  long long tot = 0;
  for (int mask = int(1); mask <= int((1 << sz1) - 1); mask++) {
    int sum = 0;
    for (int i = int(0); i <= int(sz1 - 1); i++) {
      if (mask & (1 << i)) sum += arr[i + 1].first;
    }
    ans1[sum].push_back(mask);
  }
  for (int mask = int(1); mask <= int((1 << sz2) - 1); mask++) {
    int sum = 0;
    for (int i = int(0); i <= int(sz2 - 1); i++) {
      if (mask & (1 << i)) sum += arr[i + 1 + sz1].first;
    }
    ans2[sum].push_back(mask);
  }
  if (!ans1[t].empty()) {
    for (auto it : ans1[t]) {
      short x = __builtin_popcount(it);
      int r = 0, g = 0;
      for (int i = int(0); i <= int(sz1 - 1); i++) {
        if (it & (1 << i)) {
          if (arr[i + 1].second == 1)
            r++;
          else if (arr[i + 1].second == 2)
            g++;
        }
      }
      tot += solve(x, r, g, 0);
      tot %= 1000000007;
    }
  }
  if (!ans2[t].empty()) {
    for (auto it : ans2[t]) {
      short x = __builtin_popcount(it);
      int r = 0, g = 0;
      for (int i = int(0); i <= int(sz2 - 1); i++) {
        if (it & (1 << i)) {
          if (arr[i + 1 + sz1].second == 1)
            r++;
          else if (arr[i + 1 + sz1].second == 2)
            g++;
        }
      }
      tot += solve(x, r, g, 0);
      tot %= 1000000007;
    }
  }
  for (int i = int(1); i <= int(t - 1); i++) {
    int sum1 = i;
    int sum2 = t - i;
    if (!ans1[sum1].empty() && !ans2[sum2].empty()) {
      for (auto it1 : ans1[sum1]) {
        short x = __builtin_popcount(it1);
        int r1 = 0, g1 = 0;
        for (int i = int(0); i <= int(sz1 - 1); i++) {
          if (it1 & (1 << i)) {
            if (arr[i + 1].second == 1)
              r1++;
            else if (arr[i + 1].second == 2)
              g1++;
          }
        }
        for (auto it2 : ans2[sum2]) {
          short y = __builtin_popcount(it2);
          int r2 = 0, g2 = 0;
          for (int i = int(0); i <= int(sz2 - 1); i++) {
            if (it2 & (1 << i)) {
              if (arr[i + 1 + sz1].second == 1)
                r2++;
              else if (arr[i + 1 + sz1].second == 2)
                g2++;
            }
          }
          tot += solve(x + y, r1 + r2, g1 + g2, 0);
          tot %= 1000000007;
        }
      }
    }
  }
  cout << tot;
}
