1 #include<cstdio>
2 #include<string.h>
3 int n,m,head[20010],flag[20010];
4 int num,mon[20010];
5 struct stu
6 {
7 int from,to,next;
8 }edge[20010];
9 void init()
10 {
11 memset(head,-1,sizeof(head));
12 memset(flag,0,sizeof(flag));
13 num=0;
14 }
15 void add_edge(int u,int v)
16 {
17 edge[num].from=u;
18 edge[num].to=v;
19 edge[num].next=head[u];
20 head[u]=num++;
21 }
22 int dfs(int u) //函数作用为返回 max(当前节点的值,当前节点的子节点值的和)
23 {
24 flag[u]=1;
25 int money=mon[u]; //记录当前节点的值
26 int ans=0,i,v; //ans表示子节点的和
27 for(i = head[u] ; i != -1 ; i=edge[i].next)
28 {
29 v=edge[i].to;
30 if(!flag[v])
31 {
32 ans+=dfs(v); //求子节点值的和,dfs返回 max(子节点值,子节点的字节的值的和)
33 flag[v]=1;
34 }
35 }
36 return ans=ans>money?ans:money; //返回当前节点和子节点值较大的
37 }
38 int main()
39 {
40 int t;
41 scanf("%d",&t);
42 while(t--)
43 {
44 int a,b,i;
45 int n,s,ans;
46 scanf("%d %d",&n,&s);
47 init();
48 for(i = 1 ; i <= n ; i++)
49 {
50 scanf("%d",&mon[i]);
51 }
52 for(i = 0 ; i < n-1 ; i++)
53 {
54 scanf("%d %d",&a,&b);
55 add_edge(a,b);
56 add_edge(b,a);
57 }
58 ans=dfs(s);
59 printf("%d\n",ans);
60 }
61 }