#include<bits/stdc++.h>
#define For(a,b,c) for(int a=b;a<=c;++a)
#define Dor(a,b,c) for(int a=b;a>=c;--a)
#define CC(_...) 
//fprintf(stderr,_)
using namespace std;
typedef long long LL;
enum{N=800007,P=998244353};
int n,rt,id,I[N],A[N],U[N],XY[N],hd[N],nt[N],to[N],fa[N],F[N],H[N],B[N],C[N],sz[N],de[N],tp[N],bt[N],son[N];
bool cmp(int x,int y) {
	return A[x]<A[y];
}
int Pow(int x,int k=P-2) {
	int r=1;
	while(k) {
		if(k&1) r=1LL*r*x%P;
		x=1LL*x*x%P,k>>=1;
	}
	return r;
}
typedef int Ma[3][3];
Ma S[N<<2];
int DP[3];
void Mul(Ma A,Ma B,Ma C) {
	For(i,0,2) For(j,0,2) C[i][j]=0;
	For(k,0,2) For(i,0,2) if(A[i][k]) {
		For(j,0,2) C[i][j]=(C[i][j]+1LL*A[i][k]*B[k][j])%P;
	}
}
void Mul(Ma A,int *B) {
	int C[3];
	C[0]=C[1]=C[2]=0;
	For(k,0,2) if(B[k])
		For(i,0,2)
		C[i]=(C[i]+1LL*A[i][k]*B[k])%P;
	For(i,0,2) B[i]=C[i];
}
void cook(int u=1,int L=1,int R=n) {
	S[u][0][0]=S[u][1][1]=S[u][2][2]=1;
	if(L==R) return;
	int m=(L+R)>>1;
	cook(u<<1,L,m),cook(u<<1|1,m+1,R);
}
void upd(int x,Ma K,int u=1,int L=1,int R=n) {
	if(L==R) {
		memcpy(S[u],K,sizeof(S[u]));
		return;
	}
	int m=(L+R)>>1;
	if(x<=m) upd(x,K,u<<1,L,m);
	else upd(x,K,u<<1|1,m+1,R);
	Mul(S[u<<1],S[u<<1|1],S[u]);
}
void qry(int l,int r,int u=1,int L=1,int R=n) {
	if(l>r) return;
	if(l==L&&r==R) {
		Mul(S[u],DP);
		return;
	}
	int m=(L+R)>>1;
	if(r<=m) qry(l,r,u<<1,L,m);
	else if(l>m) qry(l,r,u<<1|1,m+1,R);
	else qry(m+1,r,u<<1|1,m+1,R),qry(l,m,u<<1,L,m);
}
void walk(int u) {
	sz[u]=1,son[u]=0;
	de[u]=de[fa[u]]+1;
	for(int e=hd[u];e;e=nt[e]) {
		int v=to[e];
		if(v==fa[u]) continue;
		fa[v]=u,walk(v);
		sz[u]+=sz[v];
		if(sz[v]>sz[son[u]]) son[u]=v;
	}
}
void run(int u) {
	bt[u]=u,I[u]=++id;
	if(son[u]) tp[son[u]]=tp[u],run(son[u]),bt[u]=bt[son[u]];
	for(int e=hd[u];e;e=nt[e]) {
		int v=to[e];
		if(v==son[u]||v==fa[u]) continue;
		tp[v]=v,run(v);
	}
}
void chg(int u) {
	if(!u||!son[u]) return;
	Ma K; int v=son[u],q;
	q=Pow(C[u]+!B[v]);
	CC("C[%d] q=%d\n",u,q);
	For(i,0,2) For(j,0,2) K[i][j]=0;
	K[2][2]=K[2][0]=K[1][1]=1;
	if(H[u]) K[0][1]=sz[u];
	else K[0][0]=q,K[0][1]=XY[u]+1LL*sz[v]*(P+1-q);
	upd(I[u],K);
}
/*
void up(int u) {
	F[u]=H[u],sz[u]=1;
	for(int e=hd[u];e;e=nt[e]) {
		int v=to[e];
		if(v==fa[u]) continue;
		sz[u]+=sz[v];
		if(H[u]) (F[u]+=sz[v])%=P;
		else {
			int q;
			q=Pow(C[u]+!B[v]);
			F[u]=(F[u]+1LL*F[v]*q+1LL*sz[v]*(P+1-q))%P;
		}
	}
	chg(u);
}
void fly(int u) {
	for(int e=hd[u];e;e=nt[e]) {
		int v=to[e];
		if(v==fa[u]) continue;
		fly(v);
	}
	up(u);
}
*/
int strike(int u) {
	int r=0;
	while(u) {
		int b=bt[u],a=tp[u],c=fa[a];
		DP[0]=H[b],DP[1]=1,DP[2]=0;
		qry(I[a],I[b]-1);
		int f=DP[0];
		CC("DP[%d]=%d\n",a,f);
		if(c) {
			int q=Pow(C[c]+!B[a]);
			XY[c]=(XY[c]-1LL*F[c]*q+P)%P;
			F[c]=f;
			XY[c]=(XY[c]+1LL*f*q)%P;
		}
		r=(0LL+DP[0]+DP[2])%P;
		chg(c);
		u=c;
	}
	return r;
}
void magic() {
	For(i,1,n) scanf("%d",A+i),U[i]=i,hd[i]=H[i]=fa[i]=C[i]=B[i]=0;
	sort(U+1,U+1+n,cmp);
	cook();
	int e=id=0;
	For(i,2,n) {
		int x,y;
		scanf("%d%d",&x,&y);
		nt[++e]=hd[x],hd[x]=e,to[e]=y;
		nt[++e]=hd[y],hd[y]=e,to[e]=x;
	}
	walk(rt),tp[rt]=rt,run(rt);
	int ans=0,l=0,f=0;
	For(i,1,n) {
		int u=U[i],p=u;
		CC("u=%d\n",u);
		f=(f-strike(p)+P)%P;
		H[u]=1;
		while(u&&!B[u]) {
			int f=fa[u];
			CC("B[%d]:{}\n",u);
			B[u]=1,++C[f],chg(u);
			u=f;
			for(int e=hd[u];e;e=nt[e]) {
				int v=to[e];
				if(v==u||v==son[u]||v==fa[u]) continue;
				int q=Pow(C[u]-1+!B[v]);
				XY[u]=(XY[u]-1LL*F[v]*q-1LL*sz[v]*(P+1-q))%P;
				q=Pow(C[u]+!B[v]);
				XY[u]=(XY[u]+1LL*F[v]*q+1LL*sz[v]*(P+1-q))%P;
			}
		}
		chg(u);
		(f+=strike(p))%=P;
		CC("f=%d!\n",f);
		ans=(ans+1LL*(f-l+P)*A[U[i]])%P;
		l=f;
	}
	printf("%d\n",ans);
}
void fly(int u) {
	B[u]=F[u]=H[u]; sz[u]=1;
	int c=0;
	for(int e=hd[u];e;e=nt[e]) {
		int v=to[e];
		if(v==fa[u]) continue;
		fly(v);
		if(B[v]) ++c;
	}
	for(int e=hd[u];e;e=nt[e]) {
		int v=to[e];
		if(v==fa[u]) continue;
		B[u]|=B[v];
		sz[u]+=sz[v];
		if(H[u]) (F[u]+=sz[v])%=P;
		else {
			int p=Pow(c+!B[v]);
			F[u]=(F[u]+1LL*F[v]*p+1LL*sz[v]*(P+1-p))%P;
		}
	}
}
void magic0() {
	For(i,1,n) scanf("%d",A+i),U[i]=i,hd[i]=H[i]=fa[i]=0;
	sort(U+1,U+1+n,cmp);
	int e=0;
	For(i,2,n) {
		int x,y;
		scanf("%d%d",&x,&y);
		nt[++e]=hd[x],hd[x]=e,to[e]=y;
		nt[++e]=hd[y],hd[y]=e,to[e]=x;
	}
	walk(rt);
	int ans=0,l=0;
	For(i,1,n) {
		int p=U[i];
		H[p]=1;
		fly(rt);
		int f=0;
		For(j,1,n) (f+=F[j])%=P;
		ans=(ans+1LL*(f-l+P)*A[U[i]])%P;
		l=f;
	}
	printf("%d\n",ans);
}
int main() {
	freopen("dfs.in","r",stdin);
	freopen("dfs.out","w",stdout);
	int T,sn=0;
	scanf("%d",&T);
	while(T--) {
		scanf("%d%d",&n,&rt);
		sn+=n;
		if(sn<=40000) magic0();
		else magic();
	}
	return 0;
}
