#include<bits/stdc++.h>
using namespace std;
const int N=4e5+5,mod=998244353,inf=0x3f3f3f3f;
int head[N],deg[N],edgenum,b[N],m,st[N],top,R[N],L[N],n,rt,a[N],ans,T,num[3],val[3],tot;
struct edge{int v,next;}e[N<<1];
void add(int u,int v){
	e[++edgenum]=edge{v,head[u]};
	head[u]=edgenum;
}
void Clear(){
	for(int i=1;i<=n;i++)head[i]=deg[i]=0;
	edgenum=ans=0;
}
int Pow(int a,int b){
	int rec=1;
	for(;b;b>>=1,a=1ll*a*a%mod)
		if(b&1)rec=1ll*rec*a%mod;
	return rec;
}
namespace baoli10{
	int Min;
	void dfs(int u,int fa){
		b[++m]=u;Min=min(Min,a[u]);
		for(int i=head[u],v;i;i=e[i].next){
			if((v=e[i].v)==fa)continue;
			dfs(v,u);
		}
	}
	int solve(int u,int fa,int Min){
		Min=min(Min,a[u]);
		int rec=Min;
		for(int i=head[u],v;i;i=e[i].next){
			if((v=e[i].v)==fa)continue;
			rec=(rec+solve(v,u,Min))%mod;
		}
		return rec;
	}
	void main(){
		int inv2=Pow(2,mod-2);
		if(deg[rt]==1){
			m=0;dfs(rt,0);
			for(int i=1;i<=m;i++){
				while(top&&a[b[i]]<a[st[top]])R[st[top--]]=i-1;
				L[b[i]]=st[top]+1;st[++top]=b[i];
			}
			while(top)R[st[top--]]=m;
			for(int i=1;i<=n;i++)ans=(ans+1ll*a[b[i]]*(i-L[b[i]]+1)%mod*(R[b[i]]-i+1)%mod)%mod;
			printf("%d\n",ans);
		}else{tot=0;
			for(int i=head[rt],v;i;i=e[i].next){
				Min=inf;v=e[i].v;m=0;dfs(v,rt);
				for(int i=1;i<=m;i++){
					while(top&&a[b[i]]<a[st[top]])R[st[top--]]=i-1;
					L[b[i]]=st[top]+1;st[++top]=b[i];
				}
				while(top)R[st[top--]]=m;
				for(int i=1;i<=m;i++)ans=(ans+1ll*a[b[i]]*(i-L[b[i]]+1)%mod*(R[b[i]]-i+1)%mod)%mod;
				num[tot]=v;val[tot++]=Min;
			}
			ans=(ans+a[rt])%mod;
			for(int i=0;i<2;i++){
				ans=(ans+1ll*inv2*solve(num[i],rt,a[rt]))%mod;
				ans=(ans+1ll*inv2*solve(num[i],rt,min(a[rt],val[i^1])))%mod;
			}
			printf("%d\n",ans);
		}
	}
}
//namespace sss10{
//	void dfs(int u,int fa){
//		L[u]=++cnt;Min[u]=a[u];
//		for(int i=head[u],v;i;i=e[i].next){
//			if((v=e[i].v)==fa)continue;
//			dfs(v,u);
//			Min[u]=min(Min[u],Min[v]);
//		}R[u]=cnt;
//	}
//	int solve(int u,int v){
//		if(u==v)return a[u];
//	}
//	int get(int u,int v){
//		if(L[v]<=L[u]&&R[u]<=R[v])swap(u,v);
//		if(!(L[u]<=L[v]&&R[v]<=R[u]))return 0;
//		if(u==v)return a[u];
//		return solve(u,v);
//	}
//	void main(){
//		dfs(rt,0);
//		for(int i=1;i<=n;i++)	
//			for(int j=i+1;j<=n;j++)
//				ans=(ans+get(i,j))%mod;	
//		printf("%d\n",ans);
//	}
//}
int main(){
	freopen("dfs.in","r",stdin);
	freopen("dfs.out","w",stdout);
	scanf("%d",&T);
	while(T--){
		scanf("%d%d",&n,&rt);
		bool flag=true;
		for(int i=1;i<=n;i++)scanf("%d",&a[i]);
		for(int i=1,u,v;i<n;i++){
			scanf("%d%d",&u,&v);
			add(u,v);add(v,u);
			deg[u]++;deg[v]++;
			if(deg[u]>2||deg[v]>2)flag=false;
		}
		if(flag)baoli10::main();
//		else sss10::main();
		Clear();
	}
}
