#include <bits/stdc++.h>
using namespace std;
int n, m, V, c[51][51], a[51][2510], b[51][51][2510], w[51][51][51][3], fac[51],
    inv[51], ans, cnt[10];
inline char gc() {
  static char *S, *T, buf[1 << 16];
  if (T == S) {
    T = (S = buf) + fread(buf, 1, 1 << 16, stdin);
    if (T == S) return EOF;
  }
  return *S++;
}
inline int read() {
  int x = 0, f = 1;
  char ch = gc();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = gc();
  }
  while ('0' <= ch && ch <= '9') x = x * 10 + ch - '0', ch = gc();
  return x * f;
}
inline int add(int x, int y) {
  return x + y >= 1000000007 ? x + y - 1000000007 : x + y;
}
inline int qpow(int x, int y) {
  int t = 1;
  while (y) {
    if (y & 1) t = 1ll * t * x % 1000000007;
    x = 1ll * x * x % 1000000007;
    y >>= 1;
  }
  return t;
}
inline int C(int x, int y) {
  return 1ll * fac[x] * inv[y] % 1000000007 * inv[x - y] % 1000000007;
}
int main() {
  int NN = read();
  V = read();
  for (int i = 1; i <= NN; ++i) {
    int x = read(), y = read();
    c[y][++cnt[y]] = x;
  }
  cnt[0] = cnt[1] + cnt[2] + cnt[3];
  a[0][0] = 1;
  b[0][0][0] = 1;
  for (int i = 1; i <= cnt[1]; ++i)
    for (int k = i; k; --k)
      for (int j = c[1][i]; j <= V; ++j)
        a[k][j] = add(a[k][j], a[k - 1][j - c[1][i]]);
  for (int i = 1; i <= cnt[2]; ++i)
    for (int k = i; k; --k)
      for (int j = c[2][i]; j <= V; ++j)
        b[k][0][j] = add(b[k][0][j], b[k - 1][0][j - c[2][i]]);
  for (int i = 1; i <= cnt[3]; ++i) {
    for (int j = 0; j <= cnt[2]; ++j) {
      for (int k = i; k; --k) {
        for (int t = c[3][i]; t <= V; ++t) {
          b[j][k][t] = add(b[j][k][t], b[j][k - 1][t - c[3][i]]);
        }
      }
    }
  }
  if (cnt[1]) w[1][0][0][0] = 1;
  if (cnt[2]) w[0][1][0][1] = 1;
  if (cnt[3]) w[0][0][1][2] = 1;
  for (int i = 2; i <= cnt[0]; ++i) {
    for (int j = 0; j <= min(i, cnt[1]); ++j) {
      for (int k = 0; k <= min(i - j, cnt[2]); ++k) {
        int t = i - j - k;
        if (t > cnt[3]) continue;
        if (j)
          w[j][k][t][0] =
              add(w[j][k][t][0], add(w[j - 1][k][t][1], w[j - 1][k][t][2]));
        if (k)
          w[j][k][t][1] =
              add(w[j][k][t][1], add(w[j][k - 1][t][0], w[j][k - 1][t][2]));
        if (t)
          w[j][k][t][2] =
              add(w[j][k][t][2], add(w[j][k][t - 1][0], w[j][k][t - 1][1]));
      }
    }
  }
  fac[0] = fac[1] = 1;
  for (int i = 2; i <= cnt[0]; ++i) fac[i] = 1ll * fac[i - 1] * i % 1000000007;
  for (int i = 0; i <= cnt[1]; ++i) {
    for (int s1 = 0; s1 <= V; ++s1) {
      if (!a[i][s1]) continue;
      for (int j = 0; j <= cnt[2]; ++j) {
        for (int k = 0; k <= cnt[3]; ++k) {
          int s2 = V - s1;
          ans = add(ans,
                    1ll * a[i][s1] * b[j][k][s2] % 1000000007 *
                        add(w[i][j][k][0], add(w[i][j][k][1], w[i][j][k][2])) %
                        1000000007 * fac[i] % 1000000007 * fac[j] % 1000000007 *
                        fac[k] % 1000000007);
        }
      }
    }
  }
  printf("%d\n", ans);
  return 0;
}
