#include<iostream>
#define int long long
using namespace std;
struct node
{
	int v,next;
};
node edge[10011];
int mod=1000000007;
int dp[5011][5011],g[5011],temp[5011],head[5011],size[5011],len;
bool used[5011];
void add(int x,int y)
{
	edge[++len].v=y;
	edge[len].next=head[x];
	head[x]=len;
	return;
}
void dfs(int x)
{
	size[x]=1;
	dp[x][1]=1;
	for (int i=head[x];i>0;i=edge[i].next)
	{
		if (used[edge[i].v])
			continue;
		used[edge[i].v]=1;
		dfs(edge[i].v);
		for (int k=0;k<=size[x];++k)
		{
			temp[k]=dp[x][k];
			dp[x][k]=0;
		}
		for (int k=0;k<=size[x];++k)
			for (int j=0;j<=size[edge[i].v];++j)
			{
				dp[x][k+j]+=(temp[k]*dp[edge[i].v][j])%mod;
				dp[x][k+j]%=mod;
			}
		size[x]+=size[edge[i].v];
	}
	for (int i=0;i<=size[x];i+=2)
	{
		dp[x][0]-=(dp[x][i]*g[i])%mod;
		dp[x][0]%=mod;
	}
	return;
}
signed main()
{
	int n,x,y;
	cin>>n;
	for (int i=1;i<=n-1;++i)
	{
		cin>>x>>y;
		add(x,y);
		add(y,x);
	}
	used[1]=1;
	g[0]=1;
	for (int i=2;i<=n;i+=2)
	{
		g[i]=g[i-2]*(i-1);
		g[i]%=mod;
	}
	dfs(1);
	cout<<(mod-dp[1][0]%mod)%mod<<endl;
	return 0;
}