#include<iostream>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define ll long long 
#define pb push_back
#define  fbo(x) find_by_order(x)
#define  ook(x) order_of_key(x)
using namespace std;
using namespace __gnu_pbds;
typedef tree<
int,
null_type,
less<int>,
rb_tree_tag,
tree_order_statistics_node_update>
ordered_set;

ll ans=0;
int  checks(int n,vector<vector<int>>&adj)
{
       for(int i=1;i<=n;i++)
       {
       	 if(adj[i].size()==n-1)
       	 	return i;
       }
       return -1;
}

void dfss(int c,vector<vector<int>>&adj,int p2)
{
	ll sm=0,bg=0,sm1=0,bg1=0;
	for(auto &i:adj[c])
	{
		if(i<c)
		{
			sm+=sm1;
			sm1++;
		}
		else if(i>c)
		{
			bg+=bg1;
			bg1++;
		}
	}
	if(p2==1)
		ans=bg;
	else if(p2==3)
		ans=sm;
	else if(p2==2)
		ans=sm1*bg1;
	return;

}
void dfs(int u,int p,ordered_set &s,vector<vector<int>>&adj,int n,vector<bool>&vis,int p2)
{
	  ll ts=u-1;
	  ll tb=n-u;
	  s.insert(u);
	  ll ps=s.ook(u);
	  ll pb=(ll)s.size()-s.ook(u)-1;
	  ll es=0;
	  ll eb=0;
	  ll ans1=0;
	  for(auto&v:adj[u])
	  {
	  	if(!vis[v])
	  	{
	  		vis[v]=true;
	  		dfs(v,u,s,adj,n,vis,p2);
            ll cs=s.ook(u);
            ll cb=(ll)s.size()-s.ook(u)-1;
            ll ms=max(cs-ps,0LL);
            ll mb=max(cb-pb,0LL);
            if(p2==1)
            ans1+=(mb)*(tb-mb);
            else if(p2==3)
            ans1+=(ms)*(ts-ms);
            else if(p2==2)
            ans1+=(ms)*(tb-mb)+mb*(ts-ms); 
	  	
	  	ps=cs;
	  	pb=cb;
	  	es+=ms;
	  	eb+=mb;
	  }
	  }
	  ll sm=ts-es;
	  ll bg=tb-eb;
      sm=max(0LL,sm);
      bg=max(0LL,bg);
      if(p2==1)
      	ans1+=(bg)*(tb-bg);
      else if(p2==3)
      	ans1+=(sm)*(ts-sm);
      else if(p2==2)
      {
      	ans1+=((sm)*(tb-bg)+bg*(ts-sm));
      }
      ans1/=2;
      ans+=ans1;
      
}
int main()
{    ios::sync_with_stdio(0);
        cin.tie(0);
        cout.tie(0);
	int t;
	cin>>t;
	while(t--)
	{
		int n,p1,p2,p3,u,v;
		cin>>n>>p1>>p2>>p3;
		vector<vector<int>>adj(n+1);
		for(int i=1;i<n;i++)
		{
			cin>>u>>v;
			adj[u].pb(v);
			adj[v].pb(u);
		}
		ordered_set s;
        ans=0;
	   int c=checks(n,adj);
	   if(c!=-1)
	   {
	   	  dfss(c,adj,p2);
	   	  cout<<ans<<"\n";
	   	  continue;
	   }
        vector<bool>vis(n+1,0);
        vis[1]=true;
        s.insert(1);
        dfs(1,0,s,adj,n,vis,p2);
      //  cout<<"sasqs";
       cout<<ans<<"\n";
		

	}
	return 0;

}