#include<cstdio>
#include<vector>
#include<algorithm>
#include<cstdlib>
#include<utility>
#define mod 998244353
std::vector<int> a[800005];
int t,n,rt,fa[800005],col[800005],p[800005],cnt[800005],sz[800005],val[800005],gp[800005],dep[800005],mn[800005];
std::pair<int,int> f[800005];
long long dp[800005],g[800005],ans=0;
long long inv[800005],w[800005];
void add(int x,int y){a[x].push_back(y);a[y].push_back(x);}
//void upd(int x)
//{
////	printf("update %d\n",x);
//	if (fa[x]==-1||!col[fa[x]]) g[x]=1;
//	else g[x]=(g[fa[x]]*inv[gp[fa[x]]]%mod+1)%mod;
//	for (int i=0;i<(int)a[x].size();i++)
//	{
//		int d=a[x][i];
//		if (d==fa[x]) continue;
//		upd(d);
//	}
//}
//void getdp(int x)
//{
//	dp[x]=1;
//	for (int i=0;i<(int)a[x].size();i++)
//	{
//		int d=a[x][i];
//		if (d==fa[x]) continue;
//		dp[x]=(dp[x]+inv[p[x]]*(cnt[d]!=sz[d]?2:1)%mod*dp[d]%mod)%mod;
//	}
//}
//void solve(int x)
//{
////	printf("coloring %d\n",x);
//	col[x]=1;
//	getdp(x);
////	printf("p = %d(val = %lld)\n",p[x],dp[x]);
//	int flag=1;
//	long long lst=0;
//	int tx=x;
//	while (x!=-1)
//	{
//		++cnt[x];
//		int k=fa[x];
//		if (k==-1){x=fa[x];continue;}
//		if (!col[k]||!flag){flag=0;x=fa[x];continue;}
//		//update dp
//		long long tmp=dp[k];
//		if (cnt[x]==sz[x])
//		{
//			long long ret=(dp[k]-1+mod)*w[p[k]]%mod;
//			--p[k];
//			ret=(ret-lst+mod)%mod;
//			ret=((ret*2+dp[x])*inv[p[k]]+1)%mod;
//		}
//		else dp[k]=(dp[k]+(dp[x]-lst)*2%mod*inv[p[k]])%mod;
//		lst=tmp;
//		x=fa[x];
//	}
////	puts("QAQ");
////	x=tx;
////	upd(x);
////	printf("%d:%lld %lld %d\n",x,g[x],dp[x],val[x]);
//	ans=(ans+g[x]*dp[x]%mod*val[x])%mod;
//}
//void dfs(int v,int x,int d)
//{
//	dep[v]=d;
//	fa[v]=x;
//	mn[v]=val[v];
//	for (int i=0;i<(int)a[v].size();i++)
//	{
//		int u=a[v][i];
//		if (u==x) continue;
//		dfs(u,v,d+1);
//		mn[v]=std::min(mn[v],mn[u]);
//		sz[v]=sz[v]+sz[u];
//		++p[v];
////		++gp[v];
//	}
//}
//int cmp(std::pair<int,int> p1,std::pair<int,int> p2)
//{
//	if (p1.first!=p2.first) return p1.first>p2.first;
//	return dep[p1.second]<dep[p2.second];
//}
//void push(int x)
//{
//	
//}
//long long ss=0;
//long long getans(int v,long long pp)
//{
//	printf("getans %d %lld\n",v,pp);
//	int cnt=0;
//	long long now=1;
//	for (int i=0;i<(int)a[v].size();i++)
//	{
//		int u=a[v][i];
//		if (u==fa[v]) continue;
//		if (mn[u]<ss) ++cnt,now=now*499122177%mod;
//	}
//	long long ans=0;
//	ans=ans+pp;
//	for (int i=0;i<(int)a[v].size();i++)
//	{
//		int u=a[v][i];
//		if (u==fa[v]) continue;
//		if (val[u]<=ss) continue;
//		if (mn[u]<ss) now=now*2%mod;
//		ans=ans+getans(u,pp*now%mod);
//		if (mn[u]<ss) now=now*499122177%mod;
//	}
//	return ans;
//}
//void solve(int x)
//{
//	col[x]=1;
//	int tx=x;
//	ss=val[x];
//	long long gs=1,p=1;
//	while (x!=-1)
//	{
//		int k=fa[x];
//		if (k==-1) break;
//		if (val[k]<ss) break;
//		for (int i=0;i<(int)a[k].size();i++)
//		{
//			int d=a[k][i];
//			if (d==fa[k]||d==x) continue;
//			if (mn[d]<ss) p=p*499122177%mod;
//		}
//		gs=(gs+p)%mod;
//		x=fa[x];
//	}
//	x=tx;
//	long long ret=getans(x,1);
//	printf("%lld %lld\n",ret,gs);
//	ans=(ans+ret*gs%mod*ss)%mod;
//}
int main()
{
	freopen("dfs.in","r",stdin);
	freopen("dfs.out","w",stdout);
	scanf("%d",&t);
	while (t--)
	{
		int flag=1;
		scanf("%d%d",&n,&rt);
		w[0]=inv[0]=1;
		ans=0;
		for (int i=1;i<=n;i++) w[i]=w[i-1]*2%mod,inv[i]=inv[i-1]*499122177%mod;
		for (int i=1;i<=n;i++)
		{
			scanf("%d",&val[i]);
			f[i]=std::make_pair(val[i],i);
		}
		for (int i=1;i<n;i++)
		{
			int x,y;
			scanf("%d%d",&x,&y);
			add(x,y);
			if (x!=rt&&y!=rt) flag=0;
		}
		if (flag)
		{
			for (int i=1;i<=n;i++) ans=(ans+val[i])%mod;
			std::sort(val+1,val+n+1);
			int now=0;
			for (int i=1;i<=n;i++)
			{
				if (val[i]>=val[rt]) break;
				int a=i-1,b=i,c;
				while (b<n&&val[b+1]==val[b]) ++b;
				b=b-a;
				c=n-a-b-1;
//				printf("%d %d %d\n",a,b,c);
				ans=(ans+c*inv[a]%mod*(mod+1-inv[b])%mod*val[i])%mod;
				ans=(ans+inv[a]*b%mod*val[i])%mod;
				now=a+b;
				i=now;
			}
//			printf("now = %d\n",now);
			ans=(ans+val[rt]*inv[now]%mod*(n-1-now)%mod)%mod;
		}
//		dfs(rt,-1,1);
//		for (int i=1;i<=n;i++) printf("%d ",mn[i]);puts("");
//		std::sort(f+1,f+n+1);
//		int now=1;
//		for (int i=1;i<=n;i++) solve(i),printf("%lld\n",ans);
//		{
//			solve(f[i].second);
//			while (now<n&&f[now].first==f[i].first) push(now);
//			printf("nowans = %lld\n",ans);
//		}
		printf("%lld\n",ans);
//		return 0;
		for (int i=1;i<=n;i++) f[i]=std::make_pair(0,0),a[i].clear();
		for (int i=1;i<=n;i++) dep[i]=fa[i]=p[i]=col[i]=cnt[i]=sz[i]=val[i]=dp[i]=g[i]=mn[i]=0;
		ans=0;
	}
	return 0;
}
