1 #include <iostream>
2 #include<cstdio>
3 #include<cstring>
4 using namespace std;
5 const int maxn=0x3f3f3f3f;
6 int n,m,k;
7 int population[20];
8 int Map[20][20];
9 bool exits[20];
10 bool vis[20];
11 int d[20];
12 int p;
13 void init(int n)
14 {
15 for(int i=1; i<=n; i++)
16 {
17 for(int j=1; j<=n; j++)
18 {
19 Map[i][j]=(i!=j?maxn:0);
20 }
21 }
22 }
23 int prim()
24 {
25 int sum=0;
26 memset(vis,false,sizeof(vis));
27 for(int i=1; i<=n; i++)
28 {
29 d[i]=Map[1][i];
30 }
31 vis[1]=true;
32 for(int i=2; i<=n; i++)
33 {
34
35 int min=maxn,mini;
36 for(int j=1; j<=n; j++)
37 {
38 if(!vis[j]&&exits[j]&&d[j]<min)
39 {
40 min=d[j];
41 mini=j;
42 }
43 }
44 if(min==maxn) break;
45 sum+=min;
46 vis[mini]=true;
47 for(int k=1; k<=n; k++)
48 {
49 if(exits[k]&&!vis[k]&&Map[mini][k]<d[k])
50 {
51 d[k]=Map[mini][k];
52 }
53 }
54
55
56 }
57 int cnt1=0,cnt2=0;
58 for(int i=1;i<=n;i++){
59 cnt1+=exits[i];
60 }
61 for(int i=1;i<=n;i++){
62 cnt2+=vis[i];
63 }
64 if(cnt1==cnt2)
65 return sum;
66 else return maxn;
67
68 }
69
70 void dfs(int cur)
71 {
72 if(cur>n)
73 {
74 int pr=prim();
75 int temp=0;
76 if(pr<=k)
77 {
78 for(int i=1; i<=n; i++)
79 {
80 if(exits[i])
81 {
82 temp+=population[i];
83 }
84 }
85 if(temp>p) p=temp;
86 }
87 return ;
88 }
89 for(int i=0; i<2; i++)
90 {
91 exits[cur]=i==1?true:false;
92 dfs(cur+1);
93 }
94 }
95 int main()
96 {
97 int t;
98 scanf("%d",&t);
99 while(t--)
100 {
101 scanf("%d%d%d",&n,&m,&k);
102 for(int i=1; i<=n; i++)
103 {
104 scanf("%d",&population[i]);
105 }
106 init(n);
107 for(int i=0; i<m; i++)
108 {
109 int from,to,c;
110 scanf("%d%d%d",&from,&to,&c);
111 if(Map[from][to]>c)
112 {
113 Map[from][to]=Map[to][from]=c;
114 }
115 }
116 p=population[1];
117 exits[1]=true;
118 dfs(2);
119 printf("%d\n",p);
120 }
121 return 0;
122 }