//#pragma GCC target("avx2")
//#pragma GCC optimize("O3")
 
//#include <x86intrin.h>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <string>
#include <bitset> 
#include <vector>
#include <cmath>
#include <deque>
#include <queue>
#include <iomanip>
#include <stack>
#include <map>
#include <set>
//#include <ordered_set>
//#include <ext/pb_ds/assoc_container.hpp>
//#include <ext/pb_ds/tree_policy.hpp>
 
//using namespace __gnu_pbds;
using namespace std;
 
//template<typename T> using ordered_set = tree <T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
     
#define F first
#define S second           
#define lb lower_bound               
#define ub upper_bound
#define pb push_back
#define pf push_front    
#define ppb pop_back
#define mp make_pair                                     
#define bpp __builtin_popcountll                                                                                        
#define sqr(x) ((x) * (x)) 
#define sz(x) (int)x.size()
#define all(x) x.begin(), x.end()
#define in insert
#define ppf pop_front
#define endl '\n'
//#define int long long
 
typedef unsigned long long ull;
typedef long long ll;
typedef long double ld;
typedef pair <int, int> pii;
 
const int mod = (int)1e9 + 7;
const int N = (int)3e5 + 123;
const ll inf = (ll)1e18 + 1;
 
const double pi = acos (-1.0);
const double eps = 1e-9;                  
const int dx[] = {0, 0, 1, 0, -1};
const int dy[] = {0, 1, 0, -1, 0};

int n, m, x[55], y[55], msk[55], a[22], b[22], lvl[55], par[55], kon;
ll sp[(1 << 21)], ans;    
vector <int> g[55];

void rec (int pos, int mask = 0) {
   if (pos == kon) {       
      if (kon == (n - 1) / 2) sp[mask] ++;
      else ans += sp[(((1 << m) - 1) ^ mask)];  
      return;
   }
   rec (pos + 1, mask);
   rec (pos + 1, (mask | msk[pos]));
}

void precalc (int v = 1, int pr = 0) {
   par[v] = pr;
   lvl[v] = lvl[pr] + 1;
   for (auto to : g[v])
      if (to != pr)
         precalc (to, v);
}

inline void boost () {
   ios_base :: sync_with_stdio (0);
   cin.tie (0), cout.tie (0);
}
 
inline void Solve () {
   cin >> n;
   for (int i = 0; i < n - 1; i ++) cin >> x[i] >> y[i], g[x[i]].pb (y[i]), g[y[i]].pb (x[i]);
   precalc ();
   cin >> m;
   for (int i = 0; i < m; i ++) cin >> a[i] >> b[i];
/*   if (n == 2) {
      cout << 1;
      exit (0);
   }      */
   for (int i = 0; i < n - 1; i ++) {
      for (int j = 0; j < m; j ++) {
         int xx = a[j], yy = b[j];
         bool ok = 0;
         while (xx != yy) {
            if (lvl[xx] > lvl[yy]) {
               if ((par[xx] == x[i] && xx == y[i]) || (par[xx] == y[i] && xx == x[i])) ok = 1;
               xx = par[xx];
            }
            else {
               if ((par[yy] == x[i] && yy == y[i]) || (par[yy] == y[i] && yy == x[i])) ok = 1;
               yy = par[yy];
            }
         }
         if (ok) msk[i] |= (1 << j);
      } 
   }
   kon = (n - 1) / 2;
   rec (0); 
   for (int i = 0; i < m; i ++) {
      for (int mask = 0; mask < (1 << m); mask ++)
         if ((mask & (1 << i)))
            sp[(mask ^ (1 << i))] += sp[mask];
            
   }
   kon = n - 1;
   rec ((n - 1) / 2);
   cout << ans;
}               
 
signed main () {                                       
   #ifdef QWERTY
      freopen("input", "r", stdin);
   #endif
// freopen (".in", "r", stdin);    
// freopen (".out", "w", stdout);              
   boost ();
   int tt = 1;
   //cin >> tt;   
   while (tt --) {
      Solve ();
   }                                               
   return 0;      
}                   

Measured memory_bytes: 10496