rt
#include <bits/stdc++.h>
#define LL long long
#define ULL unsigned long long
#define int long long
//#define double long double
#define FOR(i,l,r) for(int i=l;i<=r;++i)
#define ROF(i,r,l) for(int i=r;i>=l;--i)
#define mkp make_pair
#define fr first
#define se second
#define pb push_back
#define cmax(a,b) a=max(a,b)
#define cmin(a,b) a=min(a,b)
using namespace std;
void IOS() {
ios::sync_with_stdio(false);
cin.tie(0);
}
void Document() {
freopen(".in","r",stdin);
freopen(".out","w",stdout);
}
inline int read(){
int s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){s=(s<<3)+(s<<1)+(ch^48);ch=getchar();}
return s*w;
}
inline void write(int x){
if(x<0){putchar('-');x=-x;}
if(x>9) write(x/10);
putchar(x%10+'0');
}
void Tell() {
//写数据结构注意初始化!
//浮点数类题目过不了优先考虑精度!
//vector动态开点注意内存重分配!
//有本地写freopen!没本地别写!!!
//最后几分钟给我老老实实坐那里,别手贱!!!
//long long 级别的常数运算一定要用 xll!!!
//一定要手玩几组极限数据,防止爆数。
//大数据关同步流! 大数据关同步流! 大数据关同步流!
//删调试!删调试!删调试!删调试!删调试!
//注意数据类型!注意数据类型!注意数据类型!不要把存 int 的数组开成 char 类型!
//注意数组大小的上界,不要把 5e6 打成 6e5!
}
const int N=5e5+10;
int dia[N],n,s,rt,tl,tot,hed[N],dis[N],nw,vis[N],dp[N][40],d[N],a[N],sl[N],sr[N];
struct edge {
int nxt,to,val;
}e[N<<1];
void adde(int u,int v,int w) {
e[++tot]={hed[u],v,w};
hed[u]=tot;
}
void tr_dia(int x,int fa) {
for(int i=hed[x];i;i=e[i].nxt) {
int y=e[i].to,z=e[i].val;
if(y==fa) continue;
dis[y]=dis[x]+z;
tr_dia(y,x);
}
}
bool find_dia(int x,int fa) {
if(x==rt) {
dia[++nw]=x;
return 1;
}
for(int i=hed[x];i;i=e[i].nxt) {
int y=e[i].to;
if(y==fa) continue;
if(find_dia(y,x)) {
dia[++nw]=x;
a[nw]=e[i].val;
return 1;
}
}
return 0;
}
void dfs(int x,int rt) {
for(int i=hed[x];i;i=e[i].nxt) {
int y=e[i].to;
if(vis[y]) continue;
vis[y]=1;
dis[y]=dis[x]+e[i].val;
d[rt]=max(d[rt],dis[y]);
dfs(y,x);
}
}
main() {
cin>>n>>s;
FOR(i,1,n-1) {
int u=read(),v=read(),w=read();
adde(u,v,w);
adde(v,u,w);
}
FOR(i,1,n) dis[i]=1e18;dis[1]=0;
tr_dia(1,0);FOR(i,1,n) if(dis[rt]<dis[i]) rt=i;
FOR(i,1,n) dis[i]=1e18;dis[rt]=0;
tr_dia(rt,0);FOR(i,1,n) if(dis[tl]<dis[i]) tl=i;
find_dia(tl,0);
FOR(i,1,nw) vis[dia[i]]=1;
FOR(i,1,nw) dis[i]=1e18;
FOR(i,1,nw) {
dis[dia[i]]=0;
dfs(dia[i],dia[i]);
}
int mx=0;
// FOR(i,1,nw) cout<<dia[i]<<" ";puts("");
// FOR(i,1,nw) cout<<a[i]<<" ";puts("");
FOR(i,1,nw) sl[i]=sl[i-1]+a[i],cmax(mx,d[dia[i]]);
ROF(i,nw,1) sr[i]=sr[i+1]+a[i];
int ans=1e18,jl=0;
for(int r=1,l=1;r<=nw;++r) {
while(jl>s&&l<r) {
jl-=a[l+1];
++l;
}
ans=min(ans,max(mx,max(sl[l],sr[r+1])));
jl+=a[r+1];
}
cout<<ans<<"\n";
return 0;
}
/*
5 2
1 2 5
2 3 2
2 4 4
2 5 3
*/