数组怎么算都不会爆啊qwq
#include <bits/stdc++.h>
using namespace std;
const int maxn=2e5+50;
int n,K;
int cnt=1,head[maxn],to[maxn*2],nex[maxn*2],w[maxn*2];
bool bj[maxn*2];
int ans=0x3f3f3f3f,siz[maxn],maxsiz[maxn];
int f[1000050];
void add(int x,int y,int z){to[++cnt]=y;nex[cnt]=head[x];head[x]=cnt;w[cnt]=z;}
inline int read(){
int s=0,w=1,ch=getchar();
while(!isdigit(ch)){if(ch=='-')w=-1;ch=getchar();}
while(isdigit(ch)){s=(s<<3)+(s<<1)+ch-48;ch=getchar();}
return s*w;
}
void deal_com(int u,int fa){
siz[u]=1;maxsiz[u]=0;
for(int i=head[u];i;i=nex[i]){
int v=to[u];if(v==fa||bj[i])continue;
deal_com(v,u);
siz[u]+=siz[v];
maxsiz[u]=max(maxsiz[u],siz[v]);
}
}
void deal_com2(int u,int fa,int rt,int& nrt){
maxsiz[u]=max(maxsiz[u],siz[rt]-siz[u]);
if(maxsiz[u]*2<=siz[rt])nrt=u;
for(int i=head[u];i;i=nex[i]){
int v=to[i];if(v==fa||bj[i])continue;
deal_com2(v,u,rt,nrt);
}
}
void getg(int u,int fa,int dis,int dep){
if(dis==K){ans=min(ans,dep);return;}
if(dis>K)return;
ans=min(ans,f[K-dis]+dep);
for(int i=head[u];i;i=nex[i]){
int v=to[i];if(v==fa||bj[i])continue;
getg(v,u,dis+w[i],dep+1);
}
}
void getf(int u,int fa,int dis,int dep){
if(dis>K)return;
f[dis]=min(f[dis],dep);
for(int i=head[u];i;i=nex[i]){
int v=to[i];if(v==fa||bj[i])continue;
getf(v,u,dis+w[i],dep+1);
}
}
void clear(int u,int fa,int dis){
if(dis>K)return;
f[dis]=0x3f3f3f3f;
for(int i=head[u];i;i=nex[i]){
int v=to[i];if(v==fa||bj[i])continue;
clear(v,u,dis+w[i]);
}
}
void solve(int rt){
deal_com(rt,0);
int nrt=0;
deal_com2(rt,0,rt,nrt);
for(int i=head[nrt];i;i=nex[i]){
int v=to[i];if(bj[i])continue;
getg(v,nrt,w[i],1);
getf(v,nrt,w[i],1);
}
ans=min(ans,f[K]);
clear(nrt,0,0);
for(int i=head[nrt];i;i=nex[i]){
int v=to[i];if(bj[i])continue;
bj[i]=bj[i^1]=1;
solve(v);
}
}
signed main(){
memset(f,0x3f,sizeof(f));
n=read();K=read();
for(int i=1;i<n;i++){
int x=read()+1,y=read()+1,z=read();
add(x,y,z);add(y,x,z);
}
solve(1);
if(ans==0x3f3f3f3f)ans=-1;
printf("%d\n",ans);
return 0;
}