import sys

input=sys.stdin.readline

n=int(eval(input()))

Edge=[[] for i in range(n)]

for i in range(n-1):

  a,b=list(map(int,input().split()))

  Edge[a-1].append((b-1,i))

  Edge[b-1].append((a-1,i))

m=int(eval(input()))

M=[]

for i in range(m):

  M.append(tuple(map(int,input().split())))



inf=float("inf")

path=[-1]*n #根から各点までのパスが通過する辺をbitで管理したもの

path[0]=0

stack=[0]

while stack:

  cur=stack.pop()

  for next,num in Edge[cur]:

    if path[next]==-1:

      path[next]=path[cur]|(1<<num)

      stack.append(next)



def popcount(x):

  return bin(x).count("1")



passing=[] #Mの各u,vについて、通過する辺をbitで持ったもの

for u,v in M:

  passing.append((path[u-1]^path[v-1]))



ans=2**(n-1)

#Mのすべての部分集合について符号付で足し合わせる

for i in range(1,2**m):

  i_ct=popcount(i)#満たすべき条件の数、これで符号を決める

  condition=0

  for j in range(m):

    if i&(1<<j):#j番目の条件を満たす

      condition=condition|passing[j]

  cond_ct=popcount(condition) #iが表すMの部分集合の条件をすべて満たす場合にすべて白になる辺集合の要素数



  ans+=pow((-1),i_ct)*pow(2,n-1-cond_ct)

print(ans)
import sys

input=sys.stdin.readline

n=int(eval(input()))

Edge=[[] for i in range(n)]

for i in range(n-1):

  a,b=list(map(int,input().split()))

  Edge[a-1].append((b-1,i))

  Edge[b-1].append((a-1,i))

m=int(eval(input()))

M=[]

for i in range(m):

  M.append(tuple(map(int,input().split())))



inf=float("inf")

path=[-1]*n #根から各点までのパスが通過する辺をbitで管理したもの

path[0]=0

stack=[0]

while stack:

  cur=stack.pop()

  for next,num in Edge[cur]:

    if path[next]==-1:

      path[next]=path[cur]|(1<<num)

      stack.append(next)



def popcount(x):

  x=x-((x>>1)&0x5555555555555555)

  x=(x&0x3333333333333333)+((x>>2)&0x3333333333333333)



  x=(x+(x>>4))&0x0f0f0f0f0f0f0f0f

  x=x+(x>>8)

  x=x+(x>>16)

  x=x+(x>>32)

  return x&0x0000007f



passing=[] #Mの各u,vについて、通過する辺をbitで持ったもの

for u,v in M:

  passing.append((path[u-1]^path[v-1]))



ans=2**(n-1)

#Mのすべての部分集合について符号付で足し合わせる

for i in range(1,2**m):

  i_ct=popcount(i)#満たすべき条件の数、これで符号を決める

  condition=0

  for j in range(m):

    if i&(1<<j):#j番目の条件を満たす

      condition=condition|passing[j]

  cond_ct=popcount(condition) #iが表すMの部分集合の条件をすべて満たす場合にすべて白になる辺集合の要素数



  ans+=pow((-1),i_ct)*pow(2,n-1-cond_ct)

print(ans)
import sys

input = sys.stdin.readline
n = int(eval(input()))
Edge = [[] for i in range(n)]
for i in range(n - 1):
    a, b = list(map(int, input().split()))
    Edge[a - 1].append((b - 1, i))
    Edge[b - 1].append((a - 1, i))
m = int(eval(input()))
M = []
for i in range(m):
    M.append(tuple(map(int, input().split())))
inf = float("inf")
path = [-1] * n  # 根から各点までのパスが通過する辺をbitで管理したもの
path[0] = 0
stack = [0]
while stack:
    cur = stack.pop()
    for next, num in Edge[cur]:
        if path[next] == -1:
            path[next] = path[cur] | (1 << num)
            stack.append(next)


def popcount(x):
    return bin(x).count("1")


passing = []  # Mの各u,vについて、通過する辺をbitで持ったもの
for u, v in M:
    passing.append((path[u - 1] ^ path[v - 1]))
ans = 2 ** (n - 1)
# Mのすべての部分集合について符号付で足し合わせる
for i in range(1, 2**m):
    i_ct = popcount(i)  # 満たすべき条件の数、これで符号を決める
    condition = 0
    for j in range(m):
        if i & (1 << j):  # j番目の条件を満たす
            condition = condition | passing[j]
    cond_ct = popcount(condition)  # iが表すMの部分集合の条件をすべて満たす場合にすべて白になる辺集合の要素数
    ans += pow((-1), i_ct) * pow(2, n - 1 - cond_ct)
print(ans)

import sys

input = sys.stdin.readline
n = int(eval(input()))
Edge = [[] for i in range(n)]
for i in range(n - 1):
    a, b = list(map(int, input().split()))
    Edge[a - 1].append((b - 1, i))
    Edge[b - 1].append((a - 1, i))
m = int(eval(input()))
M = []
for i in range(m):
    M.append(tuple(map(int, input().split())))
inf = float("inf")
path = [-1] * n  # 根から各点までのパスが通過する辺をbitで管理したもの
path[0] = 0
stack = [0]
while stack:
    cur = stack.pop()
    for next, num in Edge[cur]:
        if path[next] == -1:
            path[next] = path[cur] | (1 << num)
            stack.append(next)


def popcount(x):
    x = x - ((x >> 1) & 0x5555555555555555)
    x = (x & 0x3333333333333333) + ((x >> 2) & 0x3333333333333333)
    x = (x + (x >> 4)) & 0x0F0F0F0F0F0F0F0F
    x = x + (x >> 8)
    x = x + (x >> 16)
    x = x + (x >> 32)
    return x & 0x0000007F


passing = []  # Mの各u,vについて、通過する辺をbitで持ったもの
for u, v in M:
    passing.append((path[u - 1] ^ path[v - 1]))
ans = 2 ** (n - 1)
# Mのすべての部分集合について符号付で足し合わせる
for i in range(1, 2**m):
    i_ct = popcount(i)  # 満たすべき条件の数、これで符号を決める
    condition = 0
    for j in range(m):
        if i & (1 << j):  # j番目の条件を満たす
            condition = condition | passing[j]
    cond_ct = popcount(condition)  # iが表すMの部分集合の条件をすべて満たす場合にすべて白になる辺集合の要素数
    ans += pow((-1), i_ct) * pow(2, n - 1 - cond_ct)
print(ans)

-    return bin(x).count("1") +    x = x - ((x >> 1) & 0x5555555555555555) +    x = (x & 0x3333333333333333) + ((x >> 2) & 0x3333333333333333) +    x = (x + (x >> 4)) & 0x0F0F0F0F0F0F0F0F +    x = x + (x >> 8) +    x = x + (x >> 16) +    x = x + (x >> 32) +    return x & 0x0000007F