#include<bits/stdc++.h>
using namespace std;
long long T,a,b,d[400001],q,w,o,h[400001],rt,mod=998244353,mn[400001],u[400001],cn,an,dp[1005][1005],dp1[1005][1005],st[400001],g[400001],v[400001],cnn,ttt;
struct p{long long q,w;}l[800001];
void add(long long qq,long long ww){l[++o].q=ww,l[o].w=h[qq],h[qq]=o;}
long long pow_(long long qq,long long ww){long long ee=1;while(ww){if(ww&1) ee*=qq,ee%=mod;qq*=qq,qq%=mod,ww>>=1;}return ee%mod;}
void dfs2(long long qq,long long ww,long long tt,long long la)
{
//	cout<<qq<<" "<<ww<<" "<<tt<<" "<<la<<"\n";
	if(qq!=1)
	{
		for(int i=1;i<=ww;i++)
		{
			dp[la][i]+=dp[ttt][i]*tt,dp[la][i]%=mod;
		}
		for(int i=ww+1;i<=cn;i++) dp[la][ww]+=dp[ttt][i]*tt,dp[la][ww]%=mod;
	}
//	cout<<qq<<" "<<ww<<" "<<tt<<" "<<la<<"\n";
	if(la) ww=min(ww,mn[la]);
	for(int i=1;i<=cnn;i++) if(!v[i]) v[i]=1,dfs2(qq+1,ww,tt*g[cnn-qq+1]%mod,st[i]),v[i]=0;
}
void dfs(long long qq,long long ww)
{
	ttt=qq;
	dp[qq][d[qq]]++;dp[qq][d[qq]]%=mod;
	for(int i=1;i<=cn;i++) dp1[qq][i]=dp[qq][i];
	long long gg=0,bb=0;
	for(int i=h[qq];i;i=l[i].w) if(l[i].q!=ww) gg++;bb=gg;
	for(int i=1;i<=bb;i++) g[i]=pow_(i,mod-2);
	long long hh=0;cnn=0;
	for(int i=h[qq];i;i=l[i].w) if(l[i].q!=ww) st[++cnn]=l[i].q;
	dfs2(1,cn,1,0);
	for(int ii=h[qq];ii;ii=l[ii].w)
	{
		if(l[ii].q==ww) continue;
		for(int i=d[l[ii].q]+1;i<=cn;i++) dp[l[ii].q][d[l[ii].q]]+=dp[l[ii].q][i],dp[l[ii].q][i]=0,dp[l[ii].q][d[l[ii].q]]%=mod;
		dfs(l[ii].q,qq);
	}
//	for(int i=h[qq];i;i=l[i].w)
//	{
//		if(l[i].q!=ww)
//		{
//			for(int f)
//			for(int j=1;j<=cn;j++) dp[l[i].q][j]=dp1[qq][j];
//			for(int j=mn[l[i].q]+1;j<=cn;j++) dp[l[i].q][j]=dp[l[i].q][j]*tt%mod,dp[l[i].q][mn[l[i].q]]-=dp[l[i].q][j]*gg,dp[l[i].q][mn[l[i].q]]%=mod;
//			for(int j=d[l[i].q]+1;j<=cn;j++) dp[l[i].q][d[l[i].q]]+=dp[l[i].q][j],dp[l[i].q][j]=0,dp[l[i].q][d[l[i].q]]%=mod;
//			dfs(l[i].q,qq);
//		}
//	}
}
void dfs1(long long qq,long long ww){mn[qq]=d[qq];for(int i=h[qq];i;i=l[i].w) if(l[i].q!=ww) dfs1(l[i].q,qq),mn[qq]=min(mn[qq],mn[l[i].q]);}
void work()
{
	scanf("%lld%lld",&a,&rt);an=cn=o=0;
	for(int i=1;i<=a;i++) scanf("%lld",&d[i]),u[++cn]=d[i];
	sort(u+1,u+cn+1);cn=unique(u+1,u+cn+1)-u-1;
	for(int i=1;i<=a;i++) d[i]=lower_bound(u+1,u+a+1,d[i])-u;
	for(int i=1;i<a;i++) scanf("%lld%lld",&q,&w),add(q,w),add(w,q);
	dfs1(rt,0);dfs(rt,0);
	for(int i=1;i<=a;i++)
	{
		for(int j=1;j<=cn;j++) an=an+dp[i][j]*u[j],an%=mod;
	}an=(an%mod+mod)%mod;
	printf("%lld\n",an);for(int i=1;i<=a;i++) h[i]=0;
	for(int i=1;i<=a;i++) for(int j=1;j<=cn;j++) dp[i][j]=dp1[i][j]=0;
}
int main()
{
//	freopen("dfs_ex2.in","r",stdin);
	freopen("dfs.in","r",stdin);
	freopen("dfs.out","w",stdout);
	scanf("%lld",&T);
	for(int ii=1;ii<=T;ii++) work();
	return 0;
}
