#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <vector>
#define itn int
#define reaD read
#define N 5005
#define mod 1000000007
using namespace std;

int n, head[N], cnt, g[N], f[N][N], sz[N], tmp[N << 1]; 
struct edge { int to, next; } e[N << 1]; 

inline int read()
{
	int x = 0, w = 1; char c = getchar();
	while(c < '0' || c > '9') { if (c == '-') w = -1; c = getchar(); }
	while(c >= '0' && c <= '9') { x = x * 10 + c - '0'; c = getchar(); }
	return x * w;
}

inline void add(int u, int v) { e[++cnt] = (edge) { v, head[u] }; head[u] = cnt; }

void dfs(int u, int fa)
{
	f[u][1] = 1; sz[u] = 1;
	for(int i = head[u]; i; i = e[i].next)
	{
		int v = e[i].to; if(v == fa) continue;
		dfs(v, u);
		for(int j = 0; j <= sz[u] + sz[v]; j++) tmp[j] = 0;
		for(int j = 0; j <= sz[u]; j++)
			for(int k = 0; k <= sz[v]; k++)
				tmp[j + k] = (tmp[j + k] + 1ll * f[u][j] * f[v][k] % mod) % mod;
		sz[u] += sz[v]; 
		for(int j = 0; j <= sz[u]; j++) f[u][j] = tmp[j]; 
	}
	int res = 0; 
	for(int i = 0; i <= sz[u]; i += 2) res = (res + (mod - 1ll * f[u][i] * g[i] % mod)) % mod;
	f[u][0] = res; 
}

int main()
{
	n = read(); g[0] = 1; 
	for(int i = 1; i < n; i++) { int u = read(), v = read(); add(u, v); add(v, u); }
	for(int i = 2; i <= n; i += 2) g[i] = 1ll * g[i - 2] * (i - 1) % mod;
	dfs(1, 0); 
	printf("%d\n", mod - f[1][0]); 
	return 0;
} 