/** Solutie buna - Gabriel Robert Inelus*/ #include #define Nmax 100005 #define Maxcost (1<<29) using namespace std; vector > G[Nmax]; int Daddy[Nmax][18],Cost[Nmax][18],level[Nmax]; int Root,N; long long X; bitset used; void Read() { scanf("%d%lld",&N,&X); Root = 1; level[Root] = 1; Daddy[Root][0] = 0; Cost[Root][0] = 1<<30; int a,b,c; for(int i = 1; i < N; ++i) { scanf("%d%d%d",&a,&b,&c); G[a].push_back({b,c}); G[b].push_back({a,c}); } } void DFS(int k) { used[k] = 1; for(auto it : G[k]) if(!used[it.first]){ level[it.first] = level[k] + 1; Daddy[it.first][0] = k; Cost[it.first][0] = it.second; DFS(it.first); } } void BuildRootDp() { for(int step = 1; step <= 17; ++step) for(int node = 1; node <= N; ++node) { Daddy[node][step] = Daddy[Daddy[node][step - 1]][step - 1]; Cost[node][step] = Cost[node][step - 1] + Cost[Daddy[node][step - 1]][step-1]; } } int Query(int node, long long value) { int step = 0,saved = node; while(Cost[node][step + 1] <= value) ++step; while(step >= 0 && value >= Cost[node][step]) { value -= Cost[node][step]; node = Daddy[node][step]; while(step >= 0 && Cost[node][step] > value) --step; } return level[saved] - level[node]; } long long Count(long long value) { long long rez = 0; for(int i = 1; i <= N; ++i) rez += Query(i,value); return rez; } long long Solve(long long kth) { long long li,lf,m,value; li = 0; lf = Maxcost; while(li <= lf) { m = li + ((lf - li) >> 1); value = Count(m); if(value < kth) li = m + 1; else lf = m - 1; } return li; } int main() { ///freopen("treert.in","r",stdin); ///freopen("treert.out","w",stdout); Read(); DFS(Root); BuildRootDp(); long long res = Solve(X); if(res >= (1 << 29)) printf("-1\n"); else printf("%lld\n",res); return 0; }