#include<cstdio>
#include<stdio.h>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<vector>
#include<queue>
#define INF 0x3f3f3f3f
#define MAX 100005
using namespace std;
struct node
{
int u,v,w,next;
}Map[MAX];
int a[MAX],k,n,s,vis[MAX];
long long val[MAX];
void Add(int u,int v)
{
Map[k].u=u;
Map[k].v=v;
Map[k].w=1;
Map[k].next=a[u];
a[u]=k++;
}
long long DFS(int u)
{
int i,ok=0;
long long sum=0;
for(i=a[u];i!=-1;i=Map[i].next)
{
int v=Map[i].v;
if(!vis[v])
{
ok=1;
vis[v]=1;
sum+=DFS(v);
//vis[v]=0;
}
}
if(!ok)
return val[u];//如果u能到达的点都被标记过,只能去u点的宝藏
return max(val[u],sum);//择优返回
}
int main()
{
int T,i,u,v,w;
scanf("%d",&T);
while(T--)
{
k=1;
for(i=0;i<MAX;i++)
a[i]=-1;
memset(vis,0,sizeof(vis));
scanf("%d%d",&n,&s);
for(i=1;i<=n;i++)
scanf("%d",&val[i]);
for(i=1;i<n;i++)
{
scanf("%d%d",&u,&v);
Add(u,v);
Add(v,u);
}
vis[s]=1;
long long maxn=max(val[s],DFS(s));
printf("%lld\n",maxn);
}
return 0;
}