#include<bits/stdc++.h>
using namespace std;
int n, k, rt = 0, siz[2000010], mx[2000010], dep[2000010], dis[2000010], dfn[2000010], now, ans = 1e9, minn[2000010], all;
bool vis[2000010];
struct edge {
int to, val;
};
vector <edge> v[2000010];
int read() {
int sum = 0, d = 1;
char c;
c = getchar();
while(!isdigit(c)) d = c == '-' ? -d : d, c = getchar();
while(isdigit(c)) sum = (sum << 3) + (sum << 1) + c - 48, c = getchar();
return sum * d;
}
void get_root(int fa, int x) {
siz[x] = 1;
mx[x] = 0;
for (auto i : v[x]) {
if (i.to != fa && vis[i.to] == 0) {
get_root(x, i.to);
siz[x] += siz[i.to];
mx[x] = max(mx[x], siz[i.to]);
}
}
mx[x] = max(mx[x], all - siz[x]);
if (mx[x] < mx[rt]) rt = x;
}
void get_tree(int fa, int x, int deep, int dist) {
if (dist > k) return ;
dfn[++now] = x;
dep[x] = deep;
dis[x] = dist;
for (auto i : v[x]) {
if (i.to != fa && vis[i.to] == 0) {
get_tree(x, i.to, deep + 1, dist + i.val);
}
}
}
void dfz(int x) {
vis[x] = 1;
now = 0;
minn[0] = 0;
for (auto i : v[x]) {
if (vis[i.to] == 0) {
int lst = now;
get_tree(x, i.to, 1, i.val);
for (int j = lst + 1; j <= now; j++) {
ans = min(ans, minn[k - dis[dfn[j]]] + dep[dfn[j]]);
}
for (int j = lst + 1; j <= now; j++) {
minn[dis[dfn[j]]] = min(minn[dis[dfn[j]]], dep[dfn[j]]);
}
}
}
for (int i = 1; i <= now; i++) {
minn[dis[dfn[i]]] = 1e9;
}
for (auto i : v[x]) {
if (vis[i.to] == 0) {
rt = 0;
all = siz[i.to];
get_root(x, i.to);
dfz(i.to);
}
}
}
int main() {
n = read(), k = read();
for (int i = 1, x, y, z; i < n; i++) {
x = read() + 1, y = read() + 1, z = read();
v[x].push_back(edge{y, z});
v[y].push_back(edge{x, z});
}
mx[0] = n + 1;
all = n;
get_root(0, 1);
memset(minn, 0x3f, sizeof(minn));
dfz(rt);
printf("%d", (ans >= n ? -1 : ans));
}