#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e5 + 5;
struct node {int to , w;};
vector < node > e[N];
struct edge {int u , v , w;} a[N];
int n , k , fa[N] , d[N] , dis[N] , tot , pos1 , pos2 , dep[N] , maxn = INT_MIN;
bool vis[N]; int sum[N] , s , len[N];
void dfs (int u , int f)
{
for (auto v : e[u])
{
if (v.to == f) continue;
dis[v.to] = dis[u] + v.w;
dfs (v.to , u);
}
}
void calc (int u , int f) {fa[u] = f; dep[u] = dep[f] + 1; for (auto v : e[u]) {if (v.to == f) continue; calc (v.to , u);}}
void init (int u , const int root)
{
for (auto Node : e[u])
{
int v = Node.to , w = Node.w;
if (vis[v]) continue;
d[v] = d[u] + w;
init (v , root);
}
len[root] = max (len[root] , d[u]);
}
map < pair <int , int> , int> mp;
vector <int> lin , lin__;
int f[N << 2] , id[N];
#define ls (o << 1)
#define rs (o << 1 | 1)
inline void build_tree (int o , int l , int r)
{
if (l == r)
return f[o] = len[id[l - 1]] , void ();
int mid = l + r >> 1;
build_tree (ls , l , mid);
build_tree (rs , mid + 1 , r);
f[o] = max (f[ls] , f[rs]);
}
inline int query (int o , int l , int r , int x , int y)
{
if (l > r) return INT_MIN;
if (l == x && r == y)
return f[o];
int mid = l + r >> 1;
if (y <= mid)
return query (ls , l , mid , x , y);
else if (x > mid)
return query (rs , mid + 1 , r , x , y);
else
return max (query (ls , l , mid , x , mid) , query (rs , mid + 1 , r , mid + 1 , y));
}
signed main ()
{
cin >> n >> s;
for (int i = 1; i < n; i++)
{
int u , v , w;
cin >> u >> v >> w;
mp[make_pair (u , v)] = mp[make_pair (v , u)] = w;
e[u].push_back ((node){v , w});
e[v].push_back ((node){u , w});
}
dfs (1 , 0);
for (int i = 1; i <= n; i++)
if (dis[i] > dis[pos1]) pos1 = i;
memset (dis , 0 , sizeof dis);
dfs (pos1 , 0);
for (int i = 1; i <= n; i++)
if (dis[i] > dis[pos2]) pos2 = i;
memset (dis , 0 , sizeof dis);
calc (1 , 0);
int x = pos1 , y = pos2;
while (x ^ y)
{
if (dep[x] < dep[y])
x ^= y ^= x ^= y;
x = fa[x];
}
int lca = x;
x = pos1;
while (x ^ lca)
{
lin.push_back (x);
x = fa[x];
}
lin.push_back (lca);
y = pos2;
while (y ^ lca)
{
lin__.push_back (y);
y = fa[y];
}
reverse (lin__.begin () , lin__.end ());
for (auto i : lin__)
lin.push_back (i);
for (auto i : lin) vis[i] = true;
int totnode = 0;
for (auto i : lin)
init (i , i) , id[++totnode] = i;
int lstnode = lin[0];
build_tree (1 , 1 , totnode);
int l = 0 , r = 0 , lt = 0 , rt = 0 , res = INT_MAX;
for (int i = 1; i < lin.size (); i++)
sum[i] = sum[i - 1] + mp[{lstnode , lin[i]}],
lstnode = lin[i];
rt = sum[lin.size () - 1];
for (r = 1; r < lin.size (); ++r , rt -= mp[{lin[r - 1] , lin[r]}])
{
while (sum[r] - sum[l] > s)
l++ , lt += mp[{lin[l - 2] , lin[l - 1]}];
res = min (res , max ({lt , rt , query (1 , 1 , totnode , l , r)}));
}
cout << res;
return 0;
}