#include <bits/stdc++.h>
using namespace std;
long long toInt64(string s) {
  long long r = 0;
  istringstream sin(s);
  sin >> r;
  return r;
}
int toInt(string s) {
  int r = 0;
  istringstream sin(s);
  sin >> r;
  return r;
}
string toString(long long v) {
  ostringstream sout;
  sout << v;
  return sout.str();
}
string toString(int v) {
  ostringstream sout;
  sout << v;
  return sout.str();
}
template <class T>
inline T countbit(T n) {
  return (n == 0) ? 0 : (1 + countbit(n & (n - 1)));
}
template <class T>
inline T lowbit(T n) {
  return (n ^ (n - 1)) & n;
}
template <class T>
inline T sqr(T x) {
  return x * x;
}
template <class T>
inline T gcd(T a, T b) {
  if (a < 0) return gcd(-a, b);
  if (b < 0) return gcd(a, -b);
  return (b == 0) ? a : gcd(b, a % b);
}
template <class T>
inline T lcm(T a, T b) {
  return a * (b / gcd(a, b));
}
template <class T>
void out(T A[], int n) {
  for (int i = 0; i < n; ++i) cout << A[i] << " ";
  cout << endl;
}
template <class T>
void out(vector<T> A, int n = -1) {
  if (n == -1) n = A.size();
  for (int i = 0; i < n; ++i) cout << A[i] << " ";
  cout << endl;
}
const int INF = 1000000000;
const long long MOD = 1000000007;
const int maxl = 3e3 + 200;
const int maxw = 110;
const int maxn = 110;
int dp[maxl][maxw][maxn];
int main() {
  int n, L;
  while (cin >> n >> L) {
    vector<pair<int, int> > b(n + 1);
    for (int i = (0); i < ((n)); ++i) cin >> b[i + 1].first >> b[i + 1].second;
    memset((dp), 0, sizeof(dp));
    for (int i = 1; i <= n; ++i) {
      dp[b[i].first][b[i].second][i] += 1;
      if (b[i].first != b[i].second) {
        dp[b[i].second][b[i].first][i] += 1;
      }
    }
    for (int i = 0; i < L; ++i) {
      for (int w = 0; w < maxw; ++w) {
        for (int t = 0; t <= n; ++t)
          if (dp[i][w][t]) {
            for (int k = 1; k <= n; ++k)
              if (k != t && (b[k].first == w || b[k].second == w)) {
                if (b[k].first == w) {
                  int& ref = dp[i + b[k].first][b[k].second][k];
                  long long tmp = (long long)ref + (long long)dp[i][w][t];
                  tmp %= MOD;
                  ref = tmp;
                }
                if (b[k].first != b[k].second && b[k].second == w) {
                  int& ref = dp[i + b[k].second][b[k].first][k];
                  long long tmp = (long long)ref + (long long)dp[i][w][t];
                  tmp %= MOD;
                  ref = tmp;
                }
              }
          }
      }
    }
    long long ans = 0;
    for (int w = 0; w < maxw; ++w)
      for (int t = 0; t < maxn; ++t) {
        ans += dp[L][w][t];
        ans %= MOD;
      }
    ans %= MOD;
    cout << ans << endl;
  }
  return 0;
}
