#include<cstdio>
#include<cstring>
struct edge{
int point;
int data;
edge *next;
};
struct vertex{
edge *link;
vertex(){
link=NULL;
}
};
struct queue{
int data;
int pos;
};
int max,n,s,a,b,c,dist[500010],relax[500010],F[500010],stack[500010],stack2[500010],top;
edge *doing[500010];
vertex g[500010];
queue D[500010];
bool mark[500010];
void insert(int from,int to,int value){
edge *temp=new edge;
(*temp).data=value;
(*temp).next=g[from].link;
(*temp).point=to;
g[from].link=temp;
}
void search(int h){
mark[h]=true;
stack[++top]=h;
stack2[top]=0;
doing[top]=g[h].link;
while (top){
if (doing[top]==NULL) {if (stack2[top]>max) max=stack2[top];top--;}
else
if (!mark[(*doing[top]).point]){
mark[(*doing[top]).point]=true;
stack[top+1]=(*doing[top]).point;
stack2[top+1]=stack2[top]+(*doing[top]).data;
doing[top+1]=g[(*doing[top]).point].link;
doing[top]=(*doing[top]).next;
top++;
}else doing[top]=(*doing[top]).next;
}
}
void dfs(int h){
mark[h]=true;
doing[++top]=g[h].link;
stack[top]=h;
while (top)
if (doing[top]==NULL) top--;
else
if (!mark[(*doing[top]).point]){
mark[(*doing[top]).point]=true;
relax[(*doing[top]).point]=stack[top];
dist[(*doing[top]).point]=dist[stack[top]]+(*doing[top]).data;
stack[top+1]=(*doing[top]).point;
doing[top+1]=g[(*doing[top]).point].link;
doing[top]=(*doing[top]).next;
top++;
} else doing[top]=(*doing[top]).next;
}
int main(){
scanf("%d%d",&n,&s);
for (int i=1;i<n;i++){
scanf("%d%d%d",&a,&b,&c);
insert(a,b,c);
insert(b,a,c);
}
dfs(1);
int st,ed;
for (int i=1;i<=n;i++)
if (dist[i]>max) {max=dist[i];ed=i;}
memset(mark,0,sizeof(mark));
memset(dist,0,sizeof(dist));
dfs(ed);max=0;
for (int i=1;i<=n;i++)
if (dist[i]>max) {max=dist[i];st=i;}
memset(mark,0,sizeof(mark));
mark[st]=true;F[1]=st;
int num=1,now=st;
do{
now=relax[now];
mark[now]=true;
F[++num]=now;}
while (now!=ed);
int low=1,L=0,R=-1,ans=(1<<31)-1;
for (int i=1;i<=num;i++){
while (dist[F[low]]-dist[F[i]]>s) low++;
max=0;search(F[i]);
while (L<=R&&max>=D[R].data) R--;
D[++R].pos=i;
D[R].data=max;
while (D[L].pos<low) L++;
max=D[L].data;
if (dist[F[i]]>max) max=dist[F[i]];
if (dist[st]-dist[F[low]]>max) max=dist[st]-dist[F[low]];
if (max<ans) ans=max;
}
printf("%d\n",ans);
return 0;
}
/**************************************************************
Problem: 2275
User: admin
Language: C++
Result: Accepted
Time:129 ms
Memory:23184 kb
****************************************************************/