#include <bits/stdc++.h>
using namespace std;
#pragma comment(linker, "/STACK:200000000")
const double EPS = 1E-9;
const int INF = 1000000000;
const long long INF64 = (long long)1E18;
const double PI = 3.1415926535897932384626433832795;
const int MOD = INF + 7;
int a[1100], b[1100], z[3100][110][2][2], n, l;
vector<int> g[1100];
bool eq[110][110];
int rec(int l, int pr, int tp, int fl) {
  if (l < 0) return 0;
  if (l == 0 && fl) return 0;
  if (l == 0) return 1;
  if (z[l][pr][tp][fl] != -1) return z[l][pr][tp][fl];
  int len = a[pr];
  if (tp) len = b[pr];
  int res = 0;
  for (int i = 0; i < (int)(g[len].size()); i++) {
    int id = g[len][i];
    if (id == pr || fl && eq[pr][id]) continue;
    if (a[id] == len)
      res += rec(l - a[id], id, 1, 0);
    else if (b[id] == len)
      res += rec(l - b[id], id, 0, 0);
    if (res >= MOD) res -= MOD;
  }
  return z[l][pr][tp][fl] = res;
}
vector<int> out;
void recwrite(int l, int pr, int tp, int fl) {
  out.push_back(pr);
  if (l < 0) throw;
  if (l == 0 && fl) throw;
  if (l == 0) {
    for (int i = 0; i < (int)(out.size()); i++) cout << out[i] + 1 << ' ';
    cout << endl;
    out.pop_back();
    return;
  }
  int len = a[pr];
  if (tp) len = b[pr];
  int res = z[l][pr][tp][fl];
  for (int i = 0; i < (int)(g[len].size()); i++) {
    int id = g[len][i];
    if (id == pr || fl && eq[pr][id]) continue;
    if (a[id] == len) {
      if (rec(l - a[id], id, 1, 0)) recwrite(l - a[id], id, 1, 0);
    } else if (b[id] == len)
      if (rec(l - b[id], id, 0, 0)) recwrite(l - b[id], id, 0, 0);
    if (res >= MOD) res -= MOD;
  }
  out.pop_back();
}
int solve(int id) {
  int cnt = 0;
  for (int i = 0; i < (int)(n); i++)
    if (eq[id][i]) {
      if (i < id) return 0;
      cnt++;
    }
  int s1 = 0, s2 = 0;
  long long cof = 1;
  long long res = 0;
  for (int len = 1;; len++) {
    if (cnt == 1 && len > 1) break;
    if (len % 2 == 1) {
      s1 += a[id];
      s2 += b[id];
    } else {
      s1 += b[id];
      s2 += a[id];
    }
    if (s1 > l && s2 > l) break;
    if (len == 1)
      cof = cof * cnt % MOD;
    else
      cof = cof * (cnt - 1) % MOD;
    if (l == s1 || l == s2) {
      res += cof;
      res %= MOD;
    }
    res += cof * rec(l - s1, id, 1, 1);
    if (a[id] != b[id]) res += cof * rec(l - s2, id, 0, 1);
    res %= MOD;
  }
  return (int)res;
}
int main() {
  cin >> n >> l;
  for (int i = 0; i < (int)(n); i++) {
    cin >> a[i] >> b[i];
    if (a[i] > b[i]) swap(a[i], b[i]);
    g[a[i]].push_back(i);
    if (a[i] != b[i]) g[b[i]].push_back(i);
  }
  for (int i = 0; i < (int)(n); i++)
    for (int j = 0; j < (int)(n); j++)
      if (a[i] == a[j] && b[i] == b[j]) eq[i][j] = true;
  memset(z, -1, sizeof(z));
  int res = 0;
  for (int i = 0; i < (int)(n); i++) {
    res += rec(l - b[i], i, 0, 0);
    res %= MOD;
    if (a[i] != b[i]) {
      res += rec(l - a[i], i, 1, 0);
    }
    res %= MOD;
  }
  cout << res << endl;
  return 0;
}
