1 #include <cstdio>
2 #include <iostream>
3 #include <algorithm>
4 #include <cstring>
5 using namespace std;
6 struct edge {int to,from,v;}e[300*2];
7 int w[310],t[310],n,tim,cnt,head[310];
8 long long ans,f[310][310][3],a[310][3];
9 void insert(int x,int y,int v) { e[++cnt].to=y; e[cnt].from=head[x]; e[cnt].v=v; head[x]=cnt; }
10 void dp(int x,int fa)
11 {
12 for (int i=0;i<=tim;i++) f[x][i][0]=f[x][i][1]=f[x][i][2]=(i>=t[x]?w[x]:-0x3f3f3f3f);
13 for (int i=head[x];i;i=e[i].from)
14 if (e[i].to!=fa)
15 {
16 dp(e[i].to,x);
17 memcpy(a,f[x],sizeof(a));
18 for (int j=0;j<=tim;j++)
19 for (int k=0;k<=tim;k++)
20 {
21 if (j+k+2*e[i].v<=tim)
22 {
23 f[x][j+k+2*e[i].v][0]=max(f[x][j+k+2*e[i].v][0],a[j][0]+f[e[i].to][k][0]);
24 f[x][j+k+2*e[i].v][1]=max(f[x][j+k+2*e[i].v][1],a[j][1]+f[e[i].to][k][0]);
25 f[x][j+k+2*e[i].v][2]=max(f[x][j+k+2*e[i].v][2],a[j][2]+f[e[i].to][k][0]);
26 f[x][j+k+2*e[i].v][2]=max(f[x][j+k+2*e[i].v][2],a[j][0]+f[e[i].to][k][2]);
27 }
28 if (j+k+e[i].v<=tim)
29 {
30 f[x][j+k+e[i].v][1]=max(f[x][j+k+e[i].v][1],a[j][0]+f[e[i].to][k][1]);
31 f[x][j+k+e[i].v][2]=max(f[x][j+k+e[i].v][2],a[j][1]+f[e[i].to][k][1]);
32 }
33 }
34 }
35 ans=max(ans,max(f[x][tim][0],max(f[x][tim][1],f[x][tim][2])));
36 }
37 int main()
38 {
39 freopen("toyuq.in","r",stdin);
40 freopen("toyuq.out","w",stdout);
41 scanf("%d%d",&n,&tim);
42 for (int i=1;i<=n;i++) scanf("%d",&w[i]);
43 for (int i=1;i<=n;i++) scanf("%d",&t[i]);
44 for (int i=1;i<=n-1;i++)
45 {
46 int a,b,c;
47 scanf("%d%d%d",&a,&b,&c);
48 insert(a,b,c),insert(b,a,c);
49 }
50 dp(1,0); printf("%lld",ans);
51 return 0;
52 }