#include <bits/stdc++.h>   using namespace std;   int t = 1000001;   class myData {    public:     int t;     int x;     int y;     int d;     myData(int t, int x, int y, int d) : t(t), x(x), y(y), d(d) {}     bool operator<(const myData &a) const { return (this->t < a.t); }   };   long long exponentMod(long long A, long long B, long long C) {     if (A == 0) return 0;     if (B == 0) return 1;     long long y;     if (B % 2 == 0) {       y = exponentMod(A, B / 2, C);       y = (y * y) % C;     } else {       y = A % C;       y = (y * exponentMod(A, B - 1, C) % C) % C;     }     return (long long)((y + C) % C);   }   pair<int, int> factorize(long long n) {     int ans = 1;     int c = 0;     for (long long i = 2; i * i <= n; ++i) {       while (n % i == 0) {         if (i != 2) ans *= i, c++;         n /= i;       }     }     if (n != 1) {       if (n != 2) ans *= n, c++;     }     return {ans, c};   }   map<long long, long long> bit;   int N1 = 2e5;   void update(long long i) {     for (; i <= N1; i += i & (-i)) bit[i]++;   }   long long get(long long i) {     long long ans = 0;     for (; i > 0; i -= i & (-i)) ans += bit[i];     return ans;   }   int now;   bool sortByVal(const myData &a, const myData &b) { return (a.t < b.t); }   long long ans1 = 0;   int spf[1000003];   long long calc[1000003 + 1];   long long nCk(long long n, long long k, long long mod) {     return ((((calc[n] % mod) * exponentMod(calc[k], mod - 2, mod)) % mod) *             exponentMod(calc[n - k], mod - 2, mod)) %            mod;   }   void sieve() {     spf[1] = 1;     for (int i = 2; i < 1000003; i++) spf[i] = i;     for (int i = 4; i < 1000003; i += 2) spf[i] = 2;     for (int i = 3; i * i < 1000003; i++) {       if (spf[i] == i) {         for (int j = i * i; j < 1000003; j += i)           if (spf[j] == j) spf[j] = i;       }     }   }   set<int> getFactorization(int x) {     set<int> ret;     while (x != 1) {       ret.insert(spf[x]);       x = x / spf[x];     }     return ret;   }   bool prime[1000003 + 1];   void sieve2() {     memset(prime, true, sizeof(prime));     for (int p = 2; p * p <= 1000003; p++) {       if (prime[p] == true) {         for (int i = p * p; i <= 1000003; i += p) prime[i] = false;       }     }   }   int MEX(int a[], int n) {     set<int> s;     for (int i = 0; i < n; i++) {       s.insert(a[i]);     }     int c = 0;     for (auto i = s.begin(); i != s.end(); i++) {       if (*i == c) {         c++;       } else         break;     }     return c;   }   int smallestDivisor(int n) {     if (n % 2 == 0) return 2;     for (int i = 3; i * i <= n; i += 2) {       if (n % i == 0) return i;     }     return n;   }   map<int, pair<int, int>> m;   const int maxn = 3e3 + 110;   const int mod = 1e9 + 7;   int dp[maxn][310];   int a[310], b[310];   int main() {     int l, n, x, y, ans = 0;     cin >> n >> l;     for (int i = 1; i <= n; i++) {       cin >> a[i] >> b[i];       dp[a[i]][i]++;       if (a[i] != b[i]) {         a[i + n] = b[i];         b[i + n] = a[i];         dp[a[i + n]][i + n]++;       }     }     for (int i = 1; i <= l; i++) {       for (int j = 1; j <= n * 2; j++) {         if (!dp[i][j]) continue;         for (int k = 1; k <= n * 2; k++) {           if ((j % n) != (k % n) && b[j] == a[k])             dp[i + a[k]][k] = (dp[i + a[k]][k] + dp[i][j]) % mod;         }       }     }     for (int i = 1; i <= 2 * n; i++) ans = (ans + dp[l][i]) % mod;     cout << ans << endl;     return 0;   }