#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <cmath>
#include <climits>
#include <cassert>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <string>
#include <list>
#include <bitset>
#include <vector>
using namespace std;

#define I64d_OJ

//#ifdef I64d_OJ
//#define LL __int64
//#endif // I64d_OJ
#ifdef I64d_OJ
#define LL long long
#endif // I64d_OJ

typedef unsigned LL ULL;
typedef unsigned uint;
typedef pair<int,int> pii;
typedef pair<double,double> pdd;
typedef pair<LL,LL> pLL;
typedef vector<int> vi;

inline int read(){
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-') f=-f; ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();}
    return x*f;
}

#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define ls rt<<1
#define rs rt<<1|1
#define MID(a,b) (((LL)(a)+(LL)(b))>>1)
#define absx(a) ((a)<0?-(a):(a))
#define MK(a,b) make_pair(a,b)
#define PB(a) push_back(a)
#define lowbit(x) ((x)&-(x))

#define lc c[x][0]
#define rc c[x][1]

template< typename T >
inline void Max(T &a,T &b){if(a<b) a=b;}
template< typename T>
inline void Min(T &a,T &b){if(a>b) a=b;}

const double pi=(double)acos(-1.0);
const double eps=(double)1e-8;
const int INF = (int) 0x3f3f3f3f;
const int MOD = (int) 1e9+7;
const int MAXN =(int) 5e3+10;
const int MAXM = (int) 3e6+10;

///--------------------START-------------------------
int N;
vector<int> G[MAXN];
LL dp[MAXN][MAXN][2],g[MAXN],dp2[MAXN][MAXN][2];
int siz[MAXN];

void DFS(int u,int fa){
    int siz_u=G[u].size();
    siz[u]=1;
    dp[u][1][0]=1;
    for(int i=0;i<siz_u;i++){
        int v=G[u][i];
        if(v==fa) continue;
        DFS(v,u);
        for(int j=1;j<=siz[u];j++){
            for(int k=1;k<=siz[v];k++){
                dp2[u][j+k][0]+=dp[u][j][1]*dp[v][k][1]%MOD+dp[u][j][0]*dp[v][k][0]%MOD;
                dp2[u][j+k][1]+=dp[u][j][1]*dp[v][k][0]%MOD+dp[u][j][0]*dp[v][k][1]%MOD;
                dp2[u][j+k][0]%=MOD;
                dp2[u][j+k][1]%=MOD;

                dp2[u][j][0]+=dp[u][j][1]*dp[v][k][0]%MOD*g[k]%MOD+dp[u][j][0]*dp[v][k][1]%MOD*g[k]%MOD;
                dp2[u][j][1]+=dp[u][j][1]*dp[v][k][1]%MOD*g[k]%MOD+dp[u][j][0]*dp[v][k][0]%MOD*g[k]%MOD;
                dp2[u][j][0]%=MOD;
                dp2[u][j][1]%=MOD;
            }
        }
        siz[u]+=siz[v];
        for(int j=1;j<=siz[u];j++){
            dp[u][j][0]=dp2[u][j][0];
            dp[u][j][1]=dp2[u][j][1];
            dp2[u][j][0]=0;
            dp2[u][j][1]=0;
        }
    }
}

void work(){
    scanf("%d",&N);
    for(int i=1;i<N;i++){
        int u,v; scanf("%d%d",&u,&v);
        G[u].push_back(v);
        G[v].push_back(u);
    }
    LL ans=0;
    g[0]=1;
    for(int i=1;i<=N;i++){
        if(i&1) g[i]=0;
        else g[i]=g[i-2]*(i-1)%MOD;
    }
    DFS(1,-1);
    for(int s=1;s<=N;s++){
        ans+=(dp[1][s][0]-dp[1][s][1]+MOD)%MOD*g[s]%MOD;
    }
    printf("%lld\n",ans%MOD);
}

///--------------------END-------------------------
int main(){
#ifdef NNever
//freopen("data.in","r",stdin);
///freopen("out.txt","w",stdout);
#endif // NNever
    work();
    return 0;
}





Measured memory_bytes: 784512