#include<bits/stdc++.h>
#define int long long
using namespace std;
int read()
{
	int x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9')
	{
		if(c=='-')f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9')
	{
		x=x*10+c-'0';
		c=getchar();
	}
	return x*f;
}
const int MAXN=4e5+10,mod=998244353,P=499122177;
int T,n,rt,ans;
int a[MAXN];
vector<int>e[MAXN];
int fa[MAXN],num[MAXN],g[MAXN];
//int sz[MAXN],minx[MAXN];
int ex_pow(int x,int y)
{
	int sum=1;
	while(y>0)
	{
		if(y%2==1)sum=sum*x%mod;
		x=x*x%mod;
		y/=2;
	}
	return sum;
}
void dfs(int x,int y)
{
//	sz[x]=1;minx[x]=a[x];
	for(int i=0;i<e[x].size();i++)
	{
		int v=e[x][i];
		if(v==y)continue;
		fa[v]=x;
		dfs(v,x);
//		minx[x]=min(minx[x],minx[v]);size[x]+=size[v];
		num[x]++;
	}
}
//void add(int x,int y)
//{
//	cnt++;
//	v[cnt]=y;
//	net[cnt]=first[x];
//	first[x]=cnt;
//}
//bool cmp(int x,int y)
//{
//	return sz[x]<sz[y];
//}
void dfs2(int x,int y,int minx)
{
	ans=(ans+y*minx%mod)%mod;
	for(int i=0;i<e[x].size();i++)
	{
		int v=e[x][i];
		if(v==fa[x])continue;
		dfs2(v,y*g[num[x]]%mod,min(minx,a[v]));
	}
}
signed main()
{
	freopen("dfs.in","r",stdin);freopen("dfs.out","w",stdout);
	T=read();
	while(T--)
	{
		n=read();rt=read();
		for(int i=1;i<=n;i++)a[i]=read();
		for(int i=1;i<n;i++)
		{
			int x,y;
			x=read();y=read();
			e[x].push_back(y);e[y].push_back(x);
		}
		fa[rt]=0;
		dfs(rt,0);
		for(int i=1;i<=n;i++)if(g[num[i]]==0)g[num[i]]=ex_pow(num[i],mod-2);
//		for(int i=1;i<=n;i++)sort(e[i].begin(),e[i].end()); 
		for(int i=1;i<=n;i++)dfs2(i,1,a[i]);
		printf("%lld\n",ans);ans=0;
//		cnt=0;
//		for(int i=1;i<=n;i++)first[i]=0;
		for(int i=1;i<=n;i++)e[i].clear();
	}
	return 0;
}

