#include<algorithm>
#include<cmath>
#include<iomanip>
#include<iostream>
#include<map>
#include<numeric>
#include<queue>
#include<set>
#include<sstream>
#include<unordered_map>
#include<unordered_set>
#include<vector>
#include<random>
using ll = long long;
enum : int { M = (int)1e9 + 7 };
enum : ll { MLL = (ll)1e18L + 9 };
using namespace std;
#ifdef LOCAL
#include"rprint2.hpp"
#include"debug_deque.hpp"
#define vector DebugDeque
#else
#define FUNC(name) template <ostream& out = cout, class... T> void name(T&&...){ }
FUNC(prints) FUNC(printe) FUNC(printw) FUNC(printew) FUNC(printb) FUNC(printd) FUNC(printde) FUNC(printdu);
#endif
template <class S, class T>
istream& operator >> (istream& in, pair<S, T>& p){ return in >> p.first >> p.second; }
template <class T>
istream& operator >> (istream& in, vector<T>& v){ for(auto& e : v){ in >> e; } return in; }

template <ll M>
struct ModInt {
    ll num;
    ModInt(): num(0){ }
    operator ll (){ return num; }
    ModInt(ll num): num(num){ }
    template <class T> ModInt operator + (T n){ return (num + n) % M; }
    template <class T> ModInt operator - (T n){ return (num - n + M) % M; }
    template <class T> ModInt operator * (T n){ return (num * n) % M; }
    template <class T> ModInt operator / (T n){ return num * modInv(n, M) % M; }
    template <class T> ModInt operator >> (T n){ return num >> n; }
    template <class T> ModInt operator << (T n){ return (num << n) % M; }
    template <class T> ModInt operator | (T n){ return num | n; }
    template <class T> ModInt operator & (T n){ return num & n; }
    template <class T> bool operator < (T n){ return num < n; }
    template <class T> bool operator > (T n){ return num > n; }
    template <class T> bool operator <= (T n){ return num <= n; }
    template <class T> bool operator >= (T n){ return num >= n; }
    template <class T> bool operator == (T n){ return num == n; }
    template <class T> bool operator != (T n){ return num != n; }
    ModInt operator ++ (int){ ll ret = num; num = (num + 1) % M; return ret; }
    ModInt operator -- (int){ ll ret = num; num = (num - 1 + M) % M; return ret; }
    ModInt operator ++ (){ return num = (num + 1) % M; }
    ModInt operator -- (){ return num = (num - 1 + M) % M; }
    template <class T> ModInt operator += (T n){ return num = (num + n) % M; }
    template <class T> ModInt operator -= (T n){ return num = (num - n) % M; }
    template <class T> ModInt operator *= (T n){ return num = (num * n) % M; }
    template <class T> ModInt operator /= (T n){ return num = num * modInv(n) % M; }
    template <class T> ModInt operator >>= (T n){ return num = num >> n; }
    template <class T> ModInt operator <<= (T n){ return num = (num << n) % M; }
    friend ModInt modPow(ModInt base, ModInt ex) {
        ModInt ret = 1;
        while(ex.num){
            if(ex.num & 1){ ret = ret * base; }
            ex >>= 1;
            base = base * base;
        }
        return ret;
    }
    static vector<ModInt> mFacts, mInvFacts;
    friend ModInt modFact(ModInt n){ return mFacts[n.num]; }
    friend ModInt modInvFact(ModInt n){ return mInvFacts[n.num]; }
    friend ModInt modInv(ModInt n){ return modPow(n, M - 2); }
    friend ModInt modC(ModInt n, ModInt k){ return modFact(n) * modInvFact(k) * modInvFact(n - k); }
    static void init(int n){
        mFacts.resize(n + 1);
        mInvFacts.resize(n + 1);
        mFacts[0] = 1;
        for(int i = 1; i <= n; i++){
            mFacts[i] = mFacts[i - 1] * i;
        }
        mInvFacts[n] = modInv(mFacts[n]);
        for(int i = n - 1; i >= 0; i--){
            mInvFacts[i] = mInvFacts[i + 1] * (i + 1);
        }
    }
};
template <ll M>
vector<ModInt<M>> ModInt<M>::mFacts;
template <ll M>
vector<ModInt<M>> ModInt<M>::mInvFacts;
// using mint = ModInt<998244353>;
using mint = ModInt<(int)M>;

mint dp[5010][5010][2];
mint memo[10000];

mint func(mint num){
    mint ret  = 1;
    for(int i = num - 1; i > 0; i -= 2){
        ret *= i;
    }
    return ret;
}

struct Graph{
    struct Node{
        vector<int> dests;
    };
    vector<Node> nodes;
    Graph(int num): nodes(num){ }
    int id(Node* n){ return n - &nodes[0]; }
    int id(Node& n){ return &n - &nodes[0]; }
    void print(){ for(auto& node : nodes){ prints(id(node), node.dests); } }
    void addEdge(int from, int dest){
        nodes[from].dests.push_back(dest);
    }
    void addEdge2(int from, int dest){
        addEdge(from, dest);
        addEdge(dest, from);
    }
    int dfs(int idx, int from = -1){
        // vector<vector<ll>> ret;
        int vNum = 1;
        dp[idx][1][0] = 1;
        for(int didx : nodes[idx].dests){
            if(didx == from){ continue; }
            int r = dfs(didx, idx);
            vector<vector<mint>> next(vNum + r + 1, vector<mint>(2));
            for(int i = 0; i <= vNum; i++){
                for(int j = 0; j <= r; j++){
                    next[i + j][0] += dp[idx][i][0] * dp[didx][j][0] + dp[idx][i][1] * dp[didx][j][1];
                    next[i + j][1] += dp[idx][i][0] * dp[didx][j][1] + dp[idx][i][1] * dp[didx][j][0];
                    // if(j > 1){
                    //     next[i][0] -= dp[idx][i][1];
                    //     next[i][1] += dp[idx][i][0];
                    // }
                }
            }
            printde(idx, next);
            for(int i = 0; i < vNum + r + 1; i++){
                dp[idx][i][0] = next[i][0];
                dp[idx][i][1] = next[i][1];
            }
            vNum += r;
        }
        if(vNum % 2 == 0){
            // dp[idx][0][0] = from != -1;
            // dp[idx][0][0] = 1;
            for(int i = 2; i <= vNum; i += 2){
                dp[idx][0][0] += dp[idx][i][1] * memo[i];
                dp[idx][0][1] += dp[idx][i][0] * memo[i];
            }
        }
        return vNum;
    }
};

int main(){
    cin.tie(0);
    ios::sync_with_stdio(false);
    int n; cin >> n;
    Graph g(n);
    for(int i = 0; i < n - 1; i++){
        int x, y;
        cin >> x >> y;
        x--; y--;
        g.addEdge2(x, y);
    }
    mint acc = 1;
    for(int i = 1; i <= n; i += 2){
        acc *= i;
        memo[i + 1] = acc;
        printd(i + 1, memo[i + 1]);
    }
    g.dfs(0);
    for(int i = 0; i < 6; i++){
        for(int j = 0; j <= 6; j++){
            prints(i, j, dp[i][j][0], dp[i][j][1]);
        }
    }
    cout << dp[0][0][1] - dp[0][0][0] << '\n';
}


Measured memory_bytes: 393588