#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cctype>
#define rep(i,x,y) for(int i=x; i<=y; ++i)
#define repd(i,x,y) for(int i=x; i>=y; --i)

using namespace std;
const int N=5005,mod=1000000007;
typedef long long LL;
int n,h[N],cnt,siz[N],g[N],f[N][N],b[N],ans;
struct edge{int v,n;} e[N<<1];

int getint()
{
	char ch;
	while(!isdigit(ch=getchar()));
	int x=ch-48;
	while(isdigit(ch=getchar())) x=x*10+ch-48;
	return x;
}

void addedge(int u,int v)
{
	e[cnt]=(edge){v,h[u]},h[u]=cnt++;
	e[cnt]=(edge){u,h[v]},h[v]=cnt++;
}

void inc(int &x,LL y)
{
	x=(x+y)%mod;
}

void dfs(int x,int fa)
{
	siz[x]=1,f[x][1]=1;
	for(int i=h[x]; i!=-1; i=e[i].n)
		if(e[i].v!=fa)
		{
			dfs(e[i].v,x);
			rep(j,0,siz[x]+siz[e[i].v]) g[j]=0;
			rep(j,1,siz[x])
				rep(k,1,siz[e[i].v])
				{
					inc(g[j+k],(LL)f[x][j]*f[e[i].v][k]);
					inc(g[j],(LL)-f[x][j]*f[e[i].v][k]%mod*b[k]);
				}
			siz[x]+=siz[e[i].v];
			rep(j,0,siz[x]) f[x][j]=g[j];
		}
}

int main()
{
	n=getint();
	memset(h,-1,sizeof(h));
	rep(i,1,n-1) addedge(getint(),getint());
	b[0]=1;
	rep(i,1,n) if(!(i&1)) b[i]=(LL)b[i-2]*(i-1)%mod;
	dfs(1,0);
	rep(i,1,n) inc(ans,(LL)f[1][i]*b[i]);
	printf("%d\n",(ans+mod)%mod);
	return 0;
}