#include <bits/stdc++.h>
using namespace std;
const int mod = 1000000007;
const int MAXLEN = 3002;
const int MAXTYPE = 102;
const int MAXWITH = 102;
int dp1[MAXLEN][MAXTYPE][MAXWITH], dp2[MAXTYPE];
int width[MAXTYPE * 2], length[MAXTYPE * 2];
bool flag[MAXTYPE * 2];
void up(int &a, int b) {
  a += b;
  if (a >= mod) a -= mod;
}
int main() {
  int n, len;
  while (scanf("%d%d", &n, &len) != EOF) {
    int Max(0);
    memset(flag, 0, sizeof(flag));
    for (int i = 1; i <= 2 * n; i += 2) {
      scanf("%d%d", &width[i], &length[i]);
      width[i + 1] = length[i];
      length[i + 1] = width[i];
      Max = max(Max, max(width[i], length[i]));
      if (length[i] == width[i]) flag[i] = 1;
    }
    n *= 2;
    memset(dp1, 0, sizeof(dp1));
    memset(dp2, 0, sizeof(dp2));
    for (int i = 1; i <= n; ++i)
      if (!flag[i]) dp1[length[i]][(i + 1) / 2][width[i]]++;
    for (int i = 1; i <= len; ++i)
      for (int j = 1; j <= Max; ++j) {
        int sum(0);
        for (int k = 1; k <= n / 2; ++k) {
          up(sum, dp1[i][k][j]);
        }
        for (int k = 1; k <= n / 2; ++k)
          dp2[k] = (sum - dp1[i][k][j] + mod) % mod;
        for (int k = 1; k <= n; ++k) {
          if (!flag[k] && i + length[k] <= len && length[k] == j)
            up(dp1[i + length[k]][(k + 1) / 2][width[k]], dp2[(k + 1) / 2]);
        }
      }
    int ans(0);
    for (int i = 1; i <= n; ++i)
      if (!flag[i]) up(ans, dp1[len][(i + 1) / 2][width[i]]);
    printf("%d\n", ans);
  }
  return 0;
}
