//Love and Freedom.
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
#define inf 20021225
#define N 5010 
#define mdn 1000000007
using namespace std;
int read()
{
	int s=0,f=1; char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-') f=-1; ch=getchar();}
	while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
	return f*s;
}
struct edge{int to,lt;}e[N<<1];
int in[N],cnt,sz[N],f[N],g[N][N],tmp[N],n;
void add(int x,int y)
{
	e[++cnt].to=y; e[cnt].lt=in[x]; in[x]=cnt;
	e[++cnt].to=x; e[cnt].lt=in[y]; in[y]=cnt;
}
void init()
{
	f[0]=1;
	for(int i=2;i<=n;i+=2)
		f[i]=1ll*f[i-2]*(i-1)%mdn;
}
void upd(int &x,int y){x+=x+y>=mdn?y-mdn:y;}
void dfs(int x,int fr)
{
	sz[x]=1; g[x][1]=1;
	for(int i=in[x];i;i=e[i].lt)
	{
		int y=e[i].to; if(y==fr)	continue; dfs(y,x);
		memcpy(tmp,g[x],sz[x]+1<<2); memset(g[x],0,sz[x]+1<<2);
		for(int sy=0;sy<=sz[y];sy++)	for(int sx=0;sx<=sz[x];sx++)
			upd(g[x][sx+sy],1ll*g[y][sy]*tmp[sx]%mdn);
		sz[x]+=sz[y];
	}
	for(int i=1;i<=sz[x];i++)	upd(g[x][0],mdn-1ll*g[x][i]*f[i]%mdn);
}
int main()
{
	n=read(); for(int i=1;i<n;i++)	add(read(),read());
	init(); dfs(1,1); printf("%d\n",mdn-g[1][0]);
	return 0;
}