#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
inline int read()
{
	char ch=getchar(); int ne=0; while(!isdigit(ch)) {if(ch=='-') ne=1; ch=getchar();}
	int ans=0; while(isdigit(ch)) ans=ans*10+ch-'0',ch=getchar();
	if(ne) return -ans;
	else return ans;
}
void print(vector<int> v) {for(int i=1;i<(int)v.size();i++) printf("%d%c",v[i]," \n"[i==(int)v.size()-1]);}
#define mod 998244353
inline int add(int x,int y) {return x+y>=mod?x+y-mod:x+y;}
inline int sub(int x,int y) {return x-y<0?x-y+mod:x-y;}
inline int mul(int x,int y) {return 1ULL*x*y%mod;}
inline int add(int x,int y,int z) {return add(add(x,y),z);}
inline int mul(int x,int y,int z) {return mul(mul(x,y),z);}
int qpow(int x,ll y)
{
	int ans=1;
	while(y)
	{
		if(y&1) ans=mul(ans,x);
		x=mul(x,x),y>>=1;
	}
	return ans;
}
int Inv(int x) {return qpow(x,mod-2);}
#define N 400005
vector<int> G[N];
int a[N],t[N],n,m;
int inv[N];
int mn[N];
void init()
{
	for(int i=1;i<N;i++) inv[i]=Inv(i);
}
void dfs1(int u,int fa)
{
	mn[u]=a[u];
	for(int v:G[u])
	{
		if(v==fa) continue;
		dfs1(v,u),mn[u]=min(mn[u],mn[v]);
	}
}
int ans;
int cnt[N],tmp[N];
struct SMT
{
	struct Node{int val,atag,mtag,ls,rs;};
	Node t[N*120]; int cnt;
	SMT() {for(int i=0;i<N*120;i++) t[i].mtag=1;}
	void init()
	{
		for(int i=1;i<=cnt;i++) t[i].val=t[i].atag=t[i].ls=t[i].rs=0,t[i].mtag=1;
		cnt=0;
	}
	void upda(int u,int v,int l,int r) {t[u].val=add(t[u].val,mul(v,::t[r]-::t[l-1])),t[u].atag=add(t[u].atag,v);}
	void updm(int u,int v) {t[u].val=mul(t[u].val,v),t[u].mtag=mul(t[u].mtag,v),t[u].atag=mul(t[u].atag,v);}
	void pushdown(int u,int l,int r)
	{
		if(!t[u].ls) t[u].ls=++cnt;
		if(!t[u].rs) t[u].rs=++cnt;
		int mid=(l+r)/2;
		updm(t[u].ls,t[u].mtag),upda(t[u].ls,t[u].atag,l,mid);
		updm(t[u].rs,t[u].mtag),upda(t[u].rs,t[u].atag,mid+1,r);
		t[u].mtag=1,t[u].atag=0;
	}
	void pushup(int u) {t[u].val=add(t[t[u].ls].val,t[t[u].rs].val);}
	int hvson(int u) {return t[u].ls||t[u].rs;}
	void updatea(int &u,int l,int r,int L,int R,int v)
	{
		if(L>R) return ;
		if(!u) u=++cnt;
		if(L<=l&&r<=R) return upda(u,v,l,r);
		pushdown(u,l,r); int mid=(l+r)/2;
		if(mid>=L) updatea(t[u].ls,l,mid,L,R,v);
		if(mid<R) updatea(t[u].rs,mid+1,r,L,R,v);
		pushup(u);
	}
	void updatem(int &u,int l,int r,int L,int R,int v)
	{
		if(L>R) return ;
		if(!u) u=++cnt;
		if(L<=l&&r<=R) return updm(u,v);
		pushdown(u,l,r); int mid=(l+r)/2;
		if(mid>=L) updatem(t[u].ls,l,mid,L,R,v);
		if(mid<R) updatem(t[u].rs,mid+1,r,L,R,v);
		pushup(u);
	}
	int merge(int u,int v,int l,int r)
	{
		if(!u||!v) return u|v;
		if(!hvson(u)) {upda(v,t[u].atag,l,r); return v;}
		if(!hvson(v)) {upda(u,t[v].atag,l,r); return u;}
		pushdown(u,l,r),pushdown(v,l,r); int mid=(l+r)/2;
		t[u].ls=merge(t[u].ls,t[v].ls,l,mid);
		t[u].rs=merge(t[u].rs,t[v].rs,mid+1,r);
		pushup(u); return u;
	}
	void split(int rt,int &u,int &v,int l,int r,int pos)
	{
		if(pos>=r)
		{
			u=rt,v=0;
			return ;
		}
		if(pos<l)
		{
			u=0,v=rt;
			return ;
		}
		u=rt,v=++cnt;
		pushdown(rt,l,r); int mid=(l+r)/2;
		split(t[rt].ls,t[u].ls,t[v].ls,l,mid,pos);
		split(t[rt].rs,t[u].rs,t[v].rs,mid+1,r,pos);
		pushup(u),pushup(v);
	}
	void print(int u,int l,int r)
	{
		if(!u) return ;
		printf("%d %d %d : %d %d %d\n",u,l,r,t[u].val,t[u].mtag,t[u].atag);
		int mid=(l+r)/2;
		print(t[u].ls,l,mid),print(t[u].rs,mid+1,r);
	}
	int qval(int u) {return t[u].val;}
}smt;
int rt[N];
void dfs2(int u,int fa)
{
	int rtnmal=0,rtad1=0;
	for(int v:G[u])
	{
		if(v==fa) continue;
		dfs2(v,u);
		smt.updatem(rt[v],1,m,a[u]+1,m,0);
		int rtL=0,rtR=0;
		smt.split(rt[v],rtL,rtR,1,m,mn[v]);
		rtnmal=smt.merge(rtnmal,rtR,1,m);
		rtad1=smt.merge(rtad1,rtL,1,m);
//		printf("^ %d %d\n",u,v);
//		smt.print(rtnmal,1,m),smt.print(rtad1,1,m);
	}
	vector<int> val={0};
	for(int v:G[u])
	{
		if(v==fa) continue;
		val.pb(mn[v]);
	}
	sort(val.begin(),val.end()); val.pb(m);
	for(int i=1;i<(int)val.size();i++)
	{
		// val[i-1]~val[i]-1 : cnt=i-1
		smt.updatem(rtnmal,1,m,val[i-1]+1,val[i],inv[i-1]);
		smt.updatem(rtad1,1,m,val[i-1]+1,val[i],inv[i]);
	}
	rt[u]=smt.merge(rtnmal,rtad1,1,m);
	smt.updatea(rt[u],1,m,1,a[u],1);
	ans=add(ans,smt.qval(rt[u]));
//	printf("** %d\n",u),smt.print(rt[u],1,m);
//	for(int i=1;i<=a[u];i++) fu[i]=add(fu[i],1);
//	for(int i=1;i<=m;i++) ans=add(ans,mul(fu[i],t[i]-t[i-1]));
//	printf("%d : ",u),print(fu);
}
void work()
{
	int rt; cin>>n>>rt; ans=0;
	for(int i=1;i<=n;i++) G[i].clear();
	for(int i=1;i<=n;i++) a[i]=t[i]=read();
	sort(t+1,t+n+1); m=unique(t+1,t+n+1)-t-1;
	for(int i=1;i<=n;i++) a[i]=lower_bound(t+1,t+m+1,a[i])-t;
	for(int i=1;i<n;i++)
	{
		int u=read(),v=read();
		G[u].pb(v),G[v].pb(u);
	}
	dfs1(rt,0);
	smt.init();
	dfs2(rt,0);
	cout<<ans<<endl;
//	cerr<<smt.cnt<<endl;
}
signed main()
{
	freopen("dfs.in","r",stdin);
	freopen("dfs.out","w",stdout);
//	cerr<<sizeof(smt)/1024.0/1024.0<<endl;
	init();
	int T=read(); while(T--) work();
	return 0;
}

