#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define M 1000000007
void primeFactors(ll n , ll hash[101000],ll &p)
{
while (n % 2 == 0)
{
p++;
hash[p]=2;
n = n/2;
}
for (ll i = 3; i <= sqrt(n); i = i + 2)
{
while (n % i == 0)
{
// hash[i]++;
p++;
hash[p]=i;
n = n/i;
}
}
if (n > 2)
{
//hash[n]++;
p++;
hash[p]=n;
}
}
void fun()
{
ll a[100020][1000],b,n,i,j,k,l,q,c,d,size[100020]={0},nn;
ll ar[100020][1000]={0},s[100020]={0},done[100020]={0},cost[100020],p,ans[100020];
cin>>n;
for(i=1;i<n;i++)
{
cin>>c>>d;
size[c]++;
a[c][size[c]]=d;
size[d]++;
a[d][size[d]]=c;
}
s[1]++;
ar[1][s[1]]=1;
done[1]=1;
for(i=1;i<=n;i++)
{
for(j=1;j<=size[i];j++)
{
nn=a[i][j];
if(done[nn]==0)
{
s[nn]++;
ar[nn][s[nn]]=nn;
for(k=1;k<=s[i];k++)
{
s[nn]++;
ar[nn][s[nn]]=ar[i][k];
}
done[nn]=1;
}
}
}
for(i=1;i<=n;i++)
{
cin>>cost[i];
}
ll fullhash[1200][101000]={0},ps[120000]={0},ta;
for(i=1;i<=n;i++)
{
for(j=1;j<=s[i];j++)
{
primeFactors(cost[ar[i][j]],fullhash[i],ps[i]);
}
}
cin>>q;
for(i=1;i<=q;i++)
{
ll array[120000]={0},an=0,hash[101000]={0},tot=1,mai[120000],ms=0,cc,cn=0,pp;
cin>>c>>d;
if(c==d)
{
primeFactors(cost[c],hash,cn);
sort(hash+1,hash+1+ms);
cc=1;
for(j=1;j<cn;j++)
{
if(hash[j]==hash[j+1])
{
cc++;
}
else
{
tot=tot*(cc+1)%M;
cc=1;
}
}
if(cn!=0)
tot=tot*(cc+1)%M;
cout<<tot<<"\n";
continue;
}
for(j=s[c],k=s[d];ar[c][j]==ar[d][k]&&j>0&&k>0;)
{
primeFactors(cost[ar[c][j]],hash,cn);
if(ar[c][j-1]==ar[d][k-1])
primeFactors(cost[ar[d][k]],hash,cn);
k--;
j--;
}
for(j=1;j<=ps[c];j++)
{
ms++;
mai[ms]=fullhash[c][j];
}
for(j=1;j<=ps[d];j++)
{
ms++;
mai[ms]=fullhash[d][j];
}
sort(mai+1,mai+1+ms);
for(j=1;j<=cn;j++)
{
for(k=1;k<=ms;k++)
{
if(hash[j]==mai[k])
{
mai[k]=0;
// cout<<k<<" ";
break;
}
}
}
sort(mai+1,mai+1+ms);
cc=1;
for(j=1;j<ms;j++)
{
if(mai[j]==0)
continue;
if(mai[j]==mai[j+1])
{
cc++;
}
else
{
tot=tot*(cc+1)%M;
cc=1;
}
}
if(mai[ms]!=0)
tot=tot*(cc+1)%M;
cout<<tot<<"\n";
}
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
ll num;
cin>>num;
while(num>=1)
{
num–;
fun();
}
return 0;
}