import std.stdio, std.algorithm, std.range, std.conv, std.string, std.math, std.container, std.typecons;
import core.stdc.stdio;
// foreach, foreach_reverse, writeln


void main() {
	const int MOD = 1_000_000_007;
	int n;
	scanf("%d", &n);
	int[] cb = new int[n+1];
	cb[0] = 1;
	foreach (i; 2..n+1) {
		if (i&1) continue;
		cb[i] = long(cb[i-2])*(i-1)%MOD;
	}

	int[][] e = new int[][](n);
	foreach (i; 0..n-1) {
		int x, y;
		scanf("%d%d", &x, &y);
		x--; y--;
		e[x] ~= y;
		e[y] ~= x;
	}

	int[][] dfs(int v, int par=-1) {
		int[][] dp = new int[][](2,2);
		dp[0][1] = 1;
		foreach (u; e[v]) {
			if (u == par) continue;
			auto d = dfs(u,v);
			int nv = dp[0].length.to!int;
			int nu = d[0].length.to!int;
			int[][] p = new int[][](2,nv+nu-1);
			swap(dp,p);
			foreach (bi; 0..2) foreach (i; 0..nv) {
				foreach (bj; 0..2) foreach (j; 0..nu) {
					(dp[bi^bj][i+j] += long(p[bi][i])*d[bj][j]%MOD) %= MOD;
				}
			}
		}
		foreach (bi; 0..2) foreach (i; 2..dp[0].length) {
			if (i&1) continue;
			(dp[bi^1][0] += long(dp[bi][i])*cb[i]%MOD) %= MOD;
		}
		return dp;
	}

	auto dp = dfs(0);
	int ans = (dp[1][0]-dp[0][0]+MOD)%MOD;
	writeln(ans);
}