#include<bits/stdc++.h>
#define fi first
#define se second
#define Mp make_pair
#define pb push_back
#define rep(i, j, k) for (int i = (j); i <= (k); i++)
#define per(i, j, k) for (int i = (j); i >= (k); i--)
const int INF = 0x3f3f3f3f, nINF = 0xcfcfcfcf, INFMEM = 0x3f, nINFMEM = 0xcf;
const int PR1 = 1e6 + 3, PR2 = 1e9 + 7;
using namespace std;

typedef long long ll;
typedef double db;
typedef pair<int, int> PII;
typedef vector<int> VI;

const int N = 5003, mod=1e9+7;
int n,f[N][N],sz[N],g[N],tf[N];
//f[i,S]: 以i为根的子树,i在大小为S的连通块中,不包括包含i的连通块,方案数
//f[i,0]: 以i为根的子数中所有情况的统计
VI G[N];

void dfs(int x, int fz){
	f[x][1]=1; sz[x]=1;
	for(int y : G[x]) if(y!=fz){
		dfs(y,x);
		rep(i,1,sz[x]) tf[i]=f[x][i],f[x][i]=0;
		rep(i,1,sz[x]) rep(j,0,sz[y]) f[x][i+j]=(f[x][i+j]+(ll)tf[i]*f[y][j])%mod;
		//当j=0时即为i与该子树切断
		//乘法原理相乘即为总方案数
		sz[x]+=sz[y];
	}
	rep(i,1,sz[x]) f[x][0]=(f[x][0]-(ll)f[x][i]*g[i]%mod+mod)%mod;
	//统计不再加点的情况下该子树内方案总数
	//且此处'-'符合容斥原理,故输出答案时要mod-f[1][0]
}

int main(){
	scanf("%d",&n);
	g[0]=1; rep(i,2,n) g[i]=(ll)g[i-2]*(i-1)%mod;
	rep(i,1,n-1) { int x,y; scanf("%d%d",&x,&y); G[x].pb(y); G[y].pb(x); }
	dfs(1,0);
	printf("%d\n",mod-f[1][0]);
	return 0;
}