#include <bits/stdc++.h>
using namespace std;
template <class T>
inline void checkmin(T &a, T b) {
  if (b < a) a = b;
}
template <class T>
inline void checkmax(T &a, T b) {
  if (b > a) a = b;
}
int N, T;
int dp[26][26][26][2501];
int t[50], g[50];
long long zdp[26][26][26][3];
long long pai[26];
long long solve(int i, int j, int k, int p) {
  long long &ret = zdp[i][j][k][p];
  if (ret != -1) return ret;
  if (p == 0)
    i--;
  else if (p == 1)
    j--;
  else if (p == 2)
    k--;
  if (i < 0 || j < 0 || k < 0) {
    ret = 0;
    return ret;
  }
  if (i == 0 && j == 0 && k == 0) {
    ret = 1;
    return ret;
  }
  ret = 0;
  for (int np = (0); np < (int)(3); np++)
    if (np != p) {
      ret += solve(i, j, k, np);
    }
  ret %= 1000000007;
  return ret;
}
int main() {
  scanf("%d%d", &N, &T);
  pai[0] = 1;
  for (int i = (1); i < (int)(26); i++) pai[i] = pai[i - 1] * i % 1000000007;
  for (int i = (0); i < (int)(N); i++) scanf("%d%d", t + i, g + i);
  for (int i = (0); i < (int)(26); i++)
    for (int j = (0); j < (int)(26); j++)
      for (int k = (0); k < (int)(26); k++)
        for (int p = (0); p < (int)(3); p++) zdp[i][j][k][p] = -1;
  for (int i = (0); i < (int)(26); i++)
    for (int j = (0); j < (int)(26); j++)
      for (int k = (0); k < (int)(26); k++)
        for (int p = (0); p < (int)(3); p++) solve(i, j, k, p);
  dp[0][0][0][0] = 1;
  for (int i = (0); i < (int)(N); i++) {
    for (int a = ((26) - 1); a >= (int)(0); a--)
      for (int b = ((26) - 1); b >= (int)(0); b--)
        for (int c = ((26) - 1); c >= (int)(0); c--)
          if (a + b + c <= i + 1)
            for (int v = ((T + 1) - 1); v >= (int)(0); v--) {
              int ov = v - t[i];
              if (ov < 0) continue;
              int oa = a, ob = b, oc = c;
              if (g[i] == 1)
                oa--;
              else if (g[i] == 2)
                ob--;
              else
                oc--;
              if (oa < 0 || ob < 0 || oc < 0) continue;
              dp[a][b][c][v] += dp[oa][ob][oc][ov];
              if (dp[a][b][c][v] >= 1000000007) dp[a][b][c][v] -= 1000000007;
            }
  }
  long long ret = 0;
  for (int a = (0); a < (int)(26); a++)
    for (int b = (0); b < (int)(26); b++)
      for (int c = (0); c < (int)(26); c++)
        if (dp[a][b][c][T] > 0) {
          ret += (zdp[a][b][c][0] + zdp[a][b][c][1] + zdp[a][b][c][2]) *
                 dp[a][b][c][T] % 1000000007 * pai[a] % 1000000007 * pai[b] %
                 1000000007 * pai[c] % 1000000007;
        }
  ret %= 1000000007;
  cout << ret << endl;
}
