#include <bits/stdc++.h>
using namespace std;
const int N = 1020, M = 15;
const int Mod = 1000000007;
int n, m, t1, t2, Hea[N], Head[N];
int g[1 << M], p[1 << M], ans;
map<int, vector<int> > List;
map<int, int> f[N];
struct edge {
  int ver, next;
} e1[N * 2], e2[N * 2];
inline void insert(int x, int y, int id) {
  if (id == 1)
    e1[++t1] = (edge){y, Hea[x]}, Hea[x] = t1, e1[++t1] = (edge){x, Hea[y]},
    Hea[y] = t1;
  if (id == 2)
    e2[++t2] = (edge){y, Head[x]}, Head[x] = t2, e2[++t2] = (edge){x, Head[y]},
    Head[y] = t2;
}
inline int read(void) {
  int x = 0, w = 0;
  char ch = ' ';
  while (!isdigit(ch)) w |= ch == '-', ch = getchar();
  while (isdigit(ch)) x = x * 10 + ch - 48, ch = getchar();
  return w ? -x : x;
}
inline void input(void) {
  n = read();
  for (int i = 1; i < n; i++) insert(read(), read(), 1);
  m = read();
  for (int i = 1; i < m; i++) insert(read(), read(), 2);
}
inline int lenth(int x) { return 32 - __builtin_clz(x); }
inline void connect(int &x, int y) { x = x << lenth(y) | y; }
inline int Ergodic(int x, int fa) {
  int S = 1;
  vector<int> cur;
  for (int i = Head[x]; i; i = e2[i].next) {
    int y = e2[i].ver;
    if (y == fa) continue;
    cur.push_back(Ergodic(y, x));
  }
  sort(cur.begin(), cur.end());
  vector<int>::iterator it;
  for (it = cur.begin(); it != cur.end(); it++) connect(S, *it);
  S <<= 1;
  if (!List.count(S)) List[S] = cur;
  return S;
}
inline void dp(int x, int fa) {
  vector<int> ch;
  for (int i = Hea[x]; i; i = e1[i].next) {
    int y = e1[i].ver;
    if (y == fa) continue;
    ch.push_back(y), dp(y, x);
  }
  map<int, vector<int> >::iterator it;
  for (it = List.begin(); it != List.end(); it++) {
    vector<int> cur = it->second;
    int S = it->first, len = cur.size();
    memset(g, 0, sizeof g);
    g[0] = 1;
    for (int i = 0; i < ch.size(); i++) {
      memcpy(p, g, sizeof g);
      for (int j = 0; j < len; j++) {
        int val = f[ch[i]][cur[j]];
        if (val == 0) continue;
        for (int k = (1 << len) - 1; k >= 0; k--)
          if (g[k] && !(k >> j & 1) &&
              (j == 0 || cur[j] != cur[j - 1] || (k >> (j - 1) & 1)))
            p[k | (1 << j)] = (p[k | (1 << j)] + 1LL * g[k] * val % Mod) % Mod;
      }
      memcpy(g, p, sizeof p);
    }
    if (g[(1 << len) - 1]) {
      f[x][S] = g[(1 << len) - 1];
      if (lenth(S) == (m << 1)) ans = (ans + f[x][S]) % Mod;
    }
  }
}
int main() {
  input();
  for (int i = 1; i <= m; i++) Ergodic(i, 0);
  dp(1, 0);
  printf("%d\n", ans);
  return 0;
}
