#include <algorithm>
#include <array>
#include <bitset>
#include <cassert>
#include <chrono>
#include <climits>
#include <cmath>
#include <complex>
#include <cstdint>
#include <functional>
#include <fstream>
#include <iomanip>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <stack>
#include <string>
#include <thread>
#include <typeinfo>
#include <type_traits>
#include <unordered_set>
#include <utility>
#include <vector>
using namespace std;
#define pb push_back
#define F(i, l, r) for (int i = l; i < l + r; i++)
#define all(v) v.begin(), v.end()
#define allr(v) v.rbegin(), v.rend()
#define PI acos(-1)
#define bit_len(n) (n?(64 - __builtin_clzll(n)):0)
#define bit_count(n) __builtin_popcountll(n)
#define yes(i) cout << (i ? "Yes" : "No") << endl;
#define X first
#define R real()
#define Y second
#define I imag()
#define sz(v) (int)(v).size()
#define vvl(x, n, m, val) vector<vector<ll>> x(n, vector<ll>(m, val))
#define bb __int128_t
typedef long long ll;
typedef std::pair<int, int> pi;
ll inf_ll = 1e18;
const ll inf = 1e9;
typedef long double ld;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<ll> vll;
typedef vector<bool> vb;
typedef vector<string> vs;
typedef vector<pll> vp;
mt19937_64 mt(727);
uniform_int_distribution<ll> uni(1, inf / 2);
const int Mod[] = {998244353, (int)1e9 + 7};
const int max_n = 1e6 + 2;
const int N = 100;
vi dr = {-1, 1, 0, 0};
vi dc = {0, 0, -1, 1};
string dir = "DURL";
ll ncr(ll n, ll k)
{
if (n < k)
return 0;
if (n < 0 || k < 0)
return 0;
k = min(k, n - k);
ll res = 1;
F(i, 0, k)
{
res = (ll)(res * (n - i));
res = (ll)res / (i + 1);
}
return res;
}
int sqr(ll x)
{
ll l = 0, r = x;
int val = 0;
while (l <= r)
{
ll m = (l + r) / 2;
if (m * m >= x)
{
r = m - 1;
val = m;
}
else
l = m + 1;
}
return val;
}
void chmin(int &a, int b)
{
a = min(a, b);
}
void chmax(int &a, int b) {
a = max(a, b);
}
long long gcd(long long a, long long b) {
if (b == 0) return a;
return gcd(b, a % b);
}
long long lcm(long long a, long long b) {
return a*(b/gcd(a, b));
}
const int B = 500;
void solve() {
int n, k;
cin >> n >> k;
vector<pi>adj[n];
for(int i=1;i<n;i++){
int u, v, w;
cin >> u >> v >> w;
adj[u].pb({v, w}), adj[v].pb({u, w});
}
vector<int>path(n), dep(n), sub(n);
vector<pi>pres[n];
int ans = inf;
function<void(int,int, map<ll, int>&)>dfs=[&](int u, int p, map<ll,int>& mp){
mp[path[u]] = dep[u];
pres[u].emplace_back(path[u], dep[u]);
for(auto [v, w]:adj[u]){
if(v==p) continue;
path[v] = path[u] + w;
dep[v] = dep[u] + 1;
map<ll,int>curr;
dfs(v, u, curr);
if(sz(pres[u]) < sz(pres[v])){
swap(pres[u], pres[v]);
swap(mp, curr);
}
for(auto [x, d]:pres[v]){
if(mp.find(2*path[u]+k-x)==mp.end()) continue;
ans = min(ans, mp[2*path[u]+k-x] + d - 2*dep[u]);
}
for(auto [x, d]:pres[v]){
pres[u].emplace_back(x, d);
if(mp.find(x)!=mp.end()){
mp[x] = min(mp[x], d);
}
else{
mp[x] = d;
}
}
}
};
map<ll,int>tmp;
dfs(0, 0, tmp);
cout<<(ans==inf?-1:ans)<<endl;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
/*freopen("cowland.in", "r", stdin);
freopen("cowland.out", "w", stdout);*/
cout << setprecision(10) << fixed;
int tt = 1;
auto begin = std::chrono::high_resolution_clock::now();
while (tt--) {
solve();
}
/*auto end = std::chrono::high_resolution_clock::now();
auto elapsed = std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin);
cerr << "Time measured: " << elapsed.count() * 1e-9 << " seconds.\n";*/
return 0;
}