#include <bits/stdc++.h>   using namespace std;   int mod = 1e9 + 7;   struct edge {     int v, next;   };   int ans, ans2, f[1005][1 << 12];   int Pow(int a, int b) {     int rec = 1;     for (; b; b >>= 1, a = 1ll * a * a % mod)       if (b & 1) rec = 1ll * rec * a % mod;     return rec;   }   struct nade {     int head[1005], edgenum, d[1005][1005], num[1005], sta[1005], n;     edge e[1005 << 1];     void add(int u, int v) {       e[++edgenum] = edge{v, head[u]};       head[u] = edgenum;     }     void dfs(int u, int fa) {       num[u] = sta[u] = 0;       for (int i = head[u], v; i; i = e[i].next)         if ((v = e[i].v) ^ fa) {           dfs(d[u][num[u]++] = v, u);           sta[u] |= 1 << v - 1;         }     }   } s, t;   int dfs(int u, int i, int sta) {     if (!i) return !sta;     int &rec = f[s.d[u][i - 1]][sta];     if (rec != -1) return rec;     rec = dfs(u, i - 1, sta);     for (int v = s.d[u][i - 1], k = 0; k < t.n; k++)       if (sta >> k & 1)         rec = (rec + 1ll * dfs(u, i - 1, sta ^ (1 << k)) *                          dfs(v, s.num[v], t.sta[k + 1])) %               mod;     return rec;   }   int main() {     scanf( %d , &s.n);     for (int i = 1, u, v; i < s.n; i++) {       scanf( %d%d , &u, &v);       s.add(u, v);       s.add(v, u);     }     scanf( %d , &t.n);     for (int i = 1, u, v; i < t.n; i++) {       scanf( %d%d , &u, &v);       t.add(u, v);       t.add(v, u);     }     s.dfs(1, 0);     memset(f, -1, sizeof f);     for (int r = 1; r <= t.n; r++) {       t.dfs(r, 0);       for (int i = 1; i <= s.n; i++)         ans = (ans + dfs(i, s.num[i], t.sta[r])) % mod;       memset(f, -1, sizeof f);     }     s = t;     s.dfs(1, 0);     for (int r = 1; r <= t.n; r++) {       t.dfs(r, 0);       ans2 = (ans2 + dfs(1, s.num[1], t.sta[r])) % mod;       memset(f, -1, sizeof f);     }     ans = 1ll * ans * Pow(ans2, mod - 2) % mod;     printf( %d , ans);   }   