#include<iostream>
#include<cstdio>
#include<cstring>
#define mod 1000000007
#define maxn 5000
using namespace std;
typedef long long ll;
int n;
struct edge {
	int from;
	int to;
	int next;
} E[maxn*2+5];
int head[maxn+5];
int esz=1;
void add_edge(int u,int v) {
	esz++;
	E[esz].from=u;
	E[esz].to=v;
	E[esz].next=head[u];
	head[u]=esz;
}

ll g[maxn+5];
ll dp[maxn+5][maxn+5];//dp[x][i] x子树里有i个点未匹配的方案数
int sz[maxn+5];
void dfs(int x,int fa) {
	static ll tmp[maxn+5];
	dp[x][1]=1;
	sz[x]=1;
	for(int i=head[x]; i; i=E[i].next) {
		int y=E[i].to;
		if(y!=fa) {
			dfs(y,x);
			for(int j=0; j<=sz[x]+sz[y]; j++) tmp[j]=0;
			for(int j=0; j<=sz[x]; j++) {
				for(int k=0; k<=sz[y]; k++) {
					tmp[j+k]+=(dp[x][j]*dp[y][k])%mod;
					tmp[j+k]%=mod;
				}
			}
			for(int j=0; j<=sz[x]+sz[y]; j++) dp[x][j]=tmp[j];
			sz[x]+=sz[y];
		}
	}

	for(int i=2; i<=sz[x]; i++) { //对于dp[x][0],(x,fa)这条边未覆盖,容斥系数*-1
		dp[x][0]-=dp[x][i]*g[i]%mod;
		dp[x][0]=(dp[x][0]+mod)%mod;
	}

}
int main() {
	int u,v;
	scanf("%d",&n);
	for(int i=1; i<n; i++) {
		scanf("%d %d",&u,&v);
		add_edge(u,v);
		add_edge(v,u);
	}
	g[0]=1;
	for(int i=1; i<=n; i++) {
		if(i%2==1) g[i]=0;
		else g[i]=g[i-2]*(i-1)%mod;
	}
	dfs(1,0);
	printf("%lld\n",(-dp[1][0]+mod)%mod);//x=1时不存在到父亲的边,多乘了-1 
}
