#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <map>
#include <string>
using namespace std;
typedef long long LL;
const LL N = 1000000007;
const LL M = 5005;

LL ec = 0,hed[M],to[M << 1],nxt[M << 1];
LL dp[M][M],tmp[M],siz[M],g[M];
void add_edge(LL f,LL t){
	++ ec; to[ec] = t; nxt[ec] = hed[f]; hed[f] = ec;
}

void dfs(LL u,LL f){
	siz[u] = 1; dp[u][1] = 1;
	for(LL i = hed[u];i;i = nxt[i]){
		LL v = to[i];
		if(v == f) continue;
		dfs(v,u);
		for(LL i = siz[u];i >= 0;i --){
			for(LL j = siz[v];j >= 0;j --){
				tmp[i + j] = (tmp[i + j] + dp[u][i] * dp[v][j] % N) % N;
			}
		}
		for(LL i = 0;i <= siz[u] + siz[v];i ++){
			dp[u][i] = tmp[i];
			tmp[i] = 0;
		}
		siz[u] += siz[v];
	}
	for(LL i = 1;i <= siz[u];i ++) dp[u][0] = (dp[u][0] - dp[u][i] * g[i] % N + N) % N;
}

int main(){
	LL n,u,v;
	cin >> n;
	g[0] = 1; g[1] = 0;
	for(LL i = 2;i <= n;i ++) g[i] = (g[i - 2] * (i - 1)) % N;
	for(LL i = 1;i < n;i ++){
		cin >> u >> v;
		add_edge(u,v);
		add_edge(v,u);
	}
	dfs(1,0); cout << (N - dp[1][0]) % N << '\n';
	return 0;
}