// Slower C++ solution:
#include<bits/stdc++.h>



#define fi first

#define se second

#define ll long long

#define pb push_back

#define mp make_pair

#define mt make_tuple



using namespace std;



vector<int> graf[100];

map<pair<int, int>, int> grana;

vector<int> svaki[100][100];

bool veza[100];

pair<int, int> niz[30];

bool mark[60];

int n;

ll res = 0;



ll stepen(ll a, int k)

{

    if(k == 0) return 1;

    ll rez = stepen(a, k/2);

    rez *= rez;

    if(k % 2 == 1) rez *= a;

    return rez;

}



bool dfs(int x, int goal, int pret, int ind1, int ind2)

{

    //if(!prvi) cout << x << " * ";

    mark[x] = true;

    if(x == goal)

    {

        mark[x] = false;

        if(pret != 0 && pret != x) svaki[ind1][ind2].pb(grana[mp(min(x, pret), max(x, pret))]);

        return true;

    }

    for(int i = 0; i < graf[x].size(); i++)

    {

        int cvor = graf[x][i];

        if(!mark[cvor])

            if(dfs(cvor, goal, x, ind1, ind2))

            {

                mark[x] = false;

                if(pret != 0 && pret != x) svaki[ind1][ind2].pb(grana[mp(min(x, pret), max(x, pret))]);

                return true;

            }

    }

    mark[x] = false;

    return false;

}





void perm(int ind, int l, int cnt, string s, bool add)

{

    if(ind == l)

    {

        if(cnt != 0) {cout << "kurac"; return;}

        for(int i = 0; i < l; i++)

            if(s[i] == '1')

            {

                int a = min(niz[i].fi,niz[i].se);

                int b = max(niz[i].fi,niz[i].se);

                for(int i = 0; i < svaki[a][b].size(); i++) veza[svaki[a][b][i]] = true;

            }

        int broj = 0;

        for(int i = 1; i <= n; i++) if(veza[i]) broj++;

        //int broj = veza.size();

        //cout << s << " " << broj << "\n";

        broj = n - 1 - broj;

        ll komb = stepen(2, broj);



        if(add) res += komb;

        else res -= komb;

        memset(mark, false, sizeof(mark));

        memset(veza, false, sizeof(veza));

        return;

    }



    if(l - cnt > ind) perm(ind + 1, l, cnt, s + "0", add);

    if(cnt > 0) perm(ind + 1, l, cnt-1, s + "1", add);

}



int main()

{

    ios_base::sync_with_stdio(false);

    cin.tie(NULL);





    cin >> n;

    for(int i = 0; i < n - 1; i++)

    {

        int a, b;

        cin >> a >> b;

        graf[a].pb(b);

        graf[b].pb(a);

        grana[mp(min(a,b), max(a,b))] = i+1;

    }

    int m;

    cin >> m;

    for(int i = 0; i < m; i++)

        cin >> niz[i].fi >> niz[i].se;



    for(int i = 0; i < m; i++)

    {

        int a = min(niz[i].fi,niz[i].se);

        int b = max(niz[i].fi,niz[i].se);

        dfs(niz[i].fi, niz[i].se, 0, a, b);

    }



    for(int i = 1; i <= m; i++)

        perm(0, m, i, "", i % 2);



    //cout << res;

    cout << stepen(2, n-1) - res;



    return 0;

}


// Faster C++ solution for the same problem (measured speedup: 1.2617323057562073x):
//#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;      

}