Problem:


イクタ君の住む町にはN個の塔がある。
それぞれの塔には0からN&minus;1までの異なる番号が与えられており、番号iの塔を塔iと呼ぶ。
好奇心旺盛なイクタ君はN個の塔の高さに興味を持ち、それらの大小関係を表す表Tを作ることにした。
TはN &times; N個の要素を持ち、各要素Ti, j (0 ≤ i, j ≤ N &minus; 1)は次のように定義される。

 Ti, j = &minus;1  &hArr; 塔iの高さが塔jの高さより小さい

 Ti, j =  0  &hArr; 塔iの高さと塔jの高さが等しい

 Ti, j =  1  &hArr; 塔iの高さが塔jの高さより大きい

イクタ君は表Tを作成するための調査として、2つの塔を選びそれらの高さを比較するということをN&minus;1回繰り返した。

イクタ君の調査に関して以下のことがわかっている。

 i回目の比較(1 ≤ i ≤ \ N &minus; 1)で塔ai, 塔biが選ばれたとすると塔aiの高さが塔biの高さより大きかった。つまりTai, bi = 1, Tbi, ai = &minus;1であった。

 それぞれの塔は自分自身よりも大きな塔とは高々一回しか比較されていない。

残念ながらイクタ君の調査による情報だけで表Tの内容を一意に決めることができるとは限らない。
表Tがイクタ君の調査と矛盾せず、Tが定義されるような塔の高さの組み合わせが存在するときTを正しい表と呼ぶことにする。
正しい表として何通りのものが考えられるかを計算してイクタ君に教えて欲しい。

ただし、比較された２つの塔の高さは互いに異なるがすべての塔の高さが互いに異なるとは限らない。

Input

入力は以下の形式で与えられる。

N
a1 b1
...
aN&minus;1 bN&minus;1

Nは塔の数を表す。
ai, bi (1 ≤ i ≤ N &minus; 1)は塔aiが塔biより高いことを表す。

Constraints

入力中の各変数は以下の制約を満たす。

 1 ≤ N ≤ 200

 0 ≤ ai, bi 

 ai &ne; bi

 異なる塔が同じ高さであることもある。

 イクタ君の調査結果自体が矛盾していることはなく、少なくとも1つイクタ君の調査結果と矛盾しない表Tが存在する。

Output

考えられる正しい表Tの個数の数を1,000,000,007で割ったあまりを出力せよ。

Sample Input 1

3
0 1
1 2

Output for the Sample Input 1

1

 正しい表Tは上図の1通りである。

Sample Input 2

3 
0 1
0 2 

Output for the Sample Input 2

3

 正しい表Tは上図の3通りである。

Sample Input 3

1 

Output for the Sample Input 3

1

 正しい表Tは上図の1通りである。

Sample Input 4

7
0 1
1 2
2 3
3 4
0 5
0 6

Output for the Sample Input 4

91



Sample input:
3
0 1
1 2


Sample output:
1

Submission status: Accepted

Solution code:
import sys
readline = sys.stdin.readline
write = sys.stdout.write

from collections import deque

def solve():
    MOD = 10**9 + 7

    N = int(readline())

    dp0 = [[[0]*(N+1) for i in range(N+1)] for j in range(N+1)]
    dp0[0][0][0] = 1
    for c in range(1, N+1):
        for a in range(N+1):
            for b in range(N+1):
                r = 0
                if a:
                    r += dp0[c-1][a-1][b]
                if b:
                    r += dp0[c-1][a][b-1]
                if a and b:
                    r += dp0[c-1][a-1][b-1]
                dp0[c][a][b] = r % MOD

    G = [[] for i in range(N)]
    deg = [0]*N
    for i in range(N-1):
        a, b = map(int, readline().split())
        G[a].append(b)
        deg[b] += 1
    r = 0
    for i in range(N):
        if deg[i] == 0:
            r = i
            break
    que = deque([r])
    vs = []
    while que:
        v = que.popleft()
        vs.append(v)
        for w in G[v]:
            que.append(w)
    vs.reverse()
    hs = [0]*N
    for v in vs:
        e = 0
        for w in G[v]:
            e = max(e, hs[w] + 1)
        hs[v] = e

    def dfs(v):
        res = [1]
        hv = 0
        for w in G[v]:
            r = dfs(w)
            hw = len(r)-1
            r0 = [0]*(hv+hw+1)
            for i in range(hv+1):
                for j in range(hw+1):
                    for k in range(max(i, j), i+j+1):
                        r0[k] += res[i] * r[j] * dp0[k][i][j] % MOD
            res = r0
            hv += hw
        return [0] + res
    write("%d\n" % (sum(dfs(r)) % MOD))
solve()