#include<bits/stdc++.h>
#define ri register int
#define p(i) ++i
using namespace std;
namespace IO{
char buf[1<<21],*p1=buf,*p2=buf;
char gc() {return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read() {
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
}
using IO::read;
namespace nanfeng{
static const int N=2e5+7;
static const int INF=1e9+7;
struct edge {int v,w,nxt;}e[N<<1];
int first[N],G[N],siz[N],wm[N],dep[N],bc[N],coldep[N],col[N],q[N],vis[N],sum[N],res1[N],res2[N],po[N],res,mx1,mx2,n,m,ll,rl,t=1,cnt,pos,tot,ans=-INF;
void test(int x) {printf("test%d\n",x);}
struct Q{
struct Que{
int dep,w;
Que(){}
Que(int dep,int w):dep(dep),w(w){}
}que[N];
int h,t;
void init() {h=1,t=0;}
void pop() {p(h);}
Que newq(int dep,int w) {return Que(dep,w);}
void push(Que q) {
while(h<=t&&que[t].w<q.w) --t;
que[p(t)]=q;
}
int empty() {return h>t;}
Que top() {return que[h];}
}que;
bool cmp(int x,int y) {return col[x]==col[y]?dep[x]<dep[y]:coldep[col[x]]<coldep[col[y]];}
void add(int u,int v,int w) {
e[t].v=v;
e[t].w=w;
e[t].nxt=first[u];
first[u]=t++;
}
void dfs_find(int S,int x,int fa) {
siz[x]=1;
ri GS=0;
for (ri i(first[x]),v;i;i=e[i].nxt) {
if ((v=e[i].v)==fa||G[v]) continue;
dfs_find(S,v,x);
siz[x]+=siz[v];
GS=max(GS,siz[v]);
}
GS=max(GS,S-siz[x]);
if (GS<cnt) cnt=GS,pos=x;
}
void dfs_dep(int x,int fa,int dis) {
dep[x]=dis;
for (ri i(first[x]),v;i;i=e[i].nxt) {
if ((v=e[i].v)==fa||G[v]) continue;
dfs_dep(v,x,dis+1);
dep[x]=max(dep[x],dep[v]);
}
}
void bfsi(int u) {
que.init();
ri h=1,t=0,cur=mx2;
q[p(t)]=u;dep[u]=vis[u]=1;
while(h<=t) {
ri x=q[h++];
while(cur&&cur+dep[x]>=ll) que.push(que.newq(cur,res2[cur])),--cur;
while(!que.empty()&&que.top().dep+dep[x]>rl) que.pop();
if (!que.empty()) res=sum[x]+que.top().w-wm[col[u]];
else res=-INF;
ans=max(res,ans);
for (ri i(first[x]),v;i;i=e[i].nxt) {
if (vis[v=e[i].v]||G[v]) continue;
q[p(t)]=v;vis[v]=1;dep[v]=dep[x]+1;
col[v]=e[i].w;
sum[v]=sum[x]+(col[v]==col[x]?0:wm[col[v]]);
}
}
for (ri i(cur+1);i<=min(rl,dep[q[t]]);p(i)) res2[i]=-INF;
mx2=max(mx2,min(dep[q[t]],rl));
for (ri i(1);i<=t&&dep[q[i]]<=rl;p(i)) res2[dep[q[i]]]=max(res2[dep[q[i]]],sum[q[i]]);
for (ri i(1);i<=t;p(i)) vis[q[i]]=0;
}
void bfso(int tt) {
if (!tt) return;
que.init();
ri h=1,t=0,cur=mx1,qh=1,qt=0;
for (ri i(1),x;i<=tt;p(i)) q[p(t)]=(x=po[i]),vis[x]=dep[x]=1;
while(h<=t) {
ri x=q[h++];
while(cur>=0&&cur+dep[x]>=ll) que.push(que.newq(cur,res1[cur])),--cur;
while(!que.empty()&&que.top().dep+dep[x]>rl) que.pop();
if (!que.empty()) res=sum[x]+que.top().w;
else res=-INF;
ans=max(ans,res);
for (ri i(first[x]),v;i;i=e[i].nxt) {
if (vis[v=e[i].v]||G[v]) continue;
q[p(t)]=v;vis[v]=1;dep[v]=dep[x]+1;
col[v]=e[i].w;
sum[v]=sum[x]+(col[v]==col[x]?0:wm[col[v]]);
}
}
for (ri i(cur+1);i<=min(rl,dep[q[t]]);p(i)) res1[i]=-INF;
mx1=max(mx1,min(dep[q[t]],rl));
for (ri i(1);i<=t&&dep[q[i]]<=rl;p(i)) res1[dep[q[i]]]=max(res1[dep[q[i]]],sum[q[i]]);
for (ri i(1);i<=t;p(i)) vis[q[i]]=0;
}
void solve(int S,int x) {
dfs_find(cnt=S,x,0);
G[pos]=1;tot=0;
for (ri i(first[pos]),v;i;i=e[i].nxt) {
if (G[v=e[i].v]) continue;
coldep[e[i].w]=1;col[v]=e[i].w;
}
for (ri i(first[pos]),v,w;i;i=e[i].nxt) {
if (G[v=e[i].v]) continue;
bc[p(tot)]=v;
dfs_dep(v,x,1);
coldep[w=e[i].w]=max(coldep[w],dep[v]);
}
sort(bc+1,bc+tot+1,cmp);
mx1=mx2=0;
ri precol=0,tt=0;res1[0]=0;
for (ri i(1),v;i<=tot;p(i)) {
v=bc[i];
if (col[v]!=precol) precol=col[v],bfso(tt),mx2=tt=0;
sum[v]=wm[col[v]];
bfsi(v);po[p(tt)]=v;
}
bfso(tt);
for (ri i(first[pos]),v;i;i=e[i].nxt) {
if (G[v=e[i].v]) continue;
solve(siz[v],v);
}
}
int main() {
// freopen("1.in","r",stdin);
n=read(),m=read(),ll=read(),rl=read();
for (ri i(1);i<=m;p(i)) wm[i]=read();
for (ri i(1);i<n;p(i)) {
int u=read(),v=read(),w=read();
add(u,v,w);add(v,u,w);
}
solve(n,1);
printf("%d\n",ans);
return 0;
}
}
int main() {return nanfeng::main();}
dfs_find
部分开了 O(2) 不 RE,但不开会,也没找到哪越界了。