rt,只对了#2#3#4#9
#include<bits/stdc++.h>
using namespace std;
#define ll int
const ll N=2e5+9,inf=0x3f3f3f3f;
ll n,m,L,R,u,v,c,C[N<<1],ans=-inf;
ll root,siz[N],maxx[N],Sum;
ll idx,head[N<<1];
bool vis[N];
struct edge
{
ll to,next,col;
}e[N<<1];
ll cnt;
struct INFO
{
ll dis,num,b;
}info[N];
bool cmp(INFO x,INFO y)
{
if(e[x.b].col!=e[y.b].col)return e[x.b].col<e[y.b].col;
return x.b<y.b;
}
void addedge(ll u,ll v,ll c)
{
idx++;
e[idx].to=v;
e[idx].next=head[u];
e[idx].col=c;
head[u]=idx;
}
struct Seg_Tree
{
ll val[N<<2];
bool lazy[N<<2];
void clear()
{
val[0]=val[1]=-inf;
lazy[1]=1;
}
void pushdown(ll x)
{
val[x<<1]=-inf,lazy[x<<1]=1;
val[x<<1|1]=-inf,lazy[x<<1|1]=1;
lazy[x]=0;
}
void update(ll x,ll l,ll r,ll p,ll v)
{
if(l==r)
{
val[x]=v;
return;
}
ll mid=(l+r)>>1;
val[x]=max(val[x],v);
if(lazy[x])pushdown(x);
if(p<=mid)update(x<<1,l,mid,p,v);
else update(x<<1|1,mid+1,r,p,v);
}
ll query(ll x,ll l,ll r,ll Ql,ll Qr)
{
if(Ql<=l&&r<=Qr)return val[x];
ll mid=(l+r)>>1,res=-inf;
if(lazy[x])return res;
if(Ql<=mid)res=max(res,query(x<<1,l,mid,Ql,Qr));
if(mid<Qr)res=max(res,query(x<<1|1,mid+1,r,Ql,Qr));
return res;
}
void U(ll x,ll v)
{
update(1,1,n+1,x+1,v);
}
ll Q(ll l,ll r)
{
if(r<0||l>r)return -inf;
return query(1,1,n+1,l+1,r+1);
}
}Ta,Tb;
void getRoot(ll u,ll fa)
{
siz[u]=1;
maxx[u]=0;
for(int i=head[u];i;i=e[i].next)
{
ll v=e[i].to;
if(v==fa||vis[v])continue;
getRoot(v,u);
siz[u]+=siz[v];
maxx[u]=max(maxx[u],siz[v]);
}
maxx[u]=max(maxx[u],Sum-siz[u]);
if(maxx[u]<maxx[root])root=u;
}
void getDis(ll u,ll fa,ll dis,ll num,ll fa_col,ll b)
{
info[++cnt]=(INFO){dis,num,b};
for(int i=head[u];i;i=e[i].next)
{
ll v=e[i].to,col=e[i].col;
if(v==fa||vis[v])continue;
if(fa_col==col)getDis(v,u,dis,num+1,col,b);
else getDis(v,u,dis+C[col],num+1,col,b);
}
}
void cal(ll u)
{
cnt=1;
info[cnt]=(INFO){0,0,0};
for(int i=head[u];i;i=e[i].next)
{
ll v=e[i].to,col=e[i].col;
if(vis[v])continue;
getDis(v,u,C[col],1,col,i);
}
sort(info+1,info+cnt+1,cmp);
Ta.clear();
Tb.clear();
for(int a=1,b;a<=cnt;a=b+1)
{
for(b=a;b<cnt&&e[info[a].b].col==e[info[b+1].b].col;b++);
for(int c=a,d;c<=b;c=d+1)
{
for(d=c;d<b&&e[info[c].b].col==e[info[d+1].b].col;d++);
if(c!=a)
{
for(int i=c;i<=d;i++)
{
ll tem=Tb.Q(L-info[i].num,R-info[i].num);
ans=max(ans,info[i].dis+tem-C[e[info[i].b].col]);
}
}
for(int i=c;i<=d;i++)
Tb.U(info[i].num,info[i].dis);
}
Tb.clear();
if(a!=1)
{
for(int i=a;i<=b;i++)
{
ll tem=Ta.Q(L-info[i].num,R-info[i].num);
ans=max(ans,info[i].dis+tem);
}
}
for(int i=a;i<=b;i++)
Ta.U(info[i].num,info[i].dis);
}
}
void dfs(ll u)
{
vis[u]=1;
cal(u);
// cout<<ans<<endl;
for(int i=head[u];i;i=e[i].next)
{
ll v=e[i].to;
if(vis[v])continue;
root=0;
Sum=siz[v];
getRoot(v,u);
dfs(root);
}
}
int main()
{
scanf("%d%d%d%d",&n,&m,&L,&R);
for(int i=1;i<=m;i++)
scanf("%d",&C[i]);
for(int i=1;i<n;i++)
{
scanf("%d%d%d",&u,&v,&c);
addedge(u,v,c);
addedge(v,u,c);
}
root=0;
Sum=n;
maxx[root]=inf;
getRoot(1,0);
dfs(root);
printf("%d",ans);
return 0;
}