// This code is AI-generated. (AI 生成的代码)
// NOIP2018 赛道修建: binary search the answer X. Check(X): DFS; child chains
// reaching a node are either closed (length >= X) or paired with each other to
// reach X (greedy: smallest with the smallest sufficient partner); the largest
// unpaired chain is passed to the parent. The search stops as soon as m tracks
// have been formed, which makes the lower half of the binary search much cheaper.
#pragma GCC optimize("O3,unroll-loops")
#include <cstdio>
#include <algorithm>
using namespace std;
enum { MAXN = 50005, MAXE = 100005 };
static int head[MAXN], nx_[MAXE], to_[MAXE], wt_[MAXE], ec;
static int X, formed, target;
static int pool[MAXN], sp;
static int nxtp[MAXN];
static char usedp[MAXN];
static inline int findn(int p, int end) {
int r = p;
while (r < end && usedp[r]) r = nxtp[r];
while (p < r) { int t = nxtp[p]; nxtp[p] = r; p = t; }
return r;
}
static void ae(int u, int v, int w) {
to_[++ec] = v; wt_[ec] = w; nx_[ec] = head[u]; head[u] = ec;
}
// returns 0 immediately once the required number of tracks has been found
static int dfs(int u, int fa) {
int base = sp, k = 0;
for (int e = head[u]; e; e = nx_[e]) {
int v = to_[e];
if (v == fa) continue;
int d = dfs(v, u) + wt_[e];
if (formed >= target) return 0;
if (d >= X) formed++;
else { pool[base + k] = d; k++; sp = base + k; }
}
if (k == 1) { int r = pool[base]; sp = base; return r; }
int end = base + k;
if (k > 1) sort(pool + base, pool + end);
for (int i = base; i <= end; i++) { nxtp[i] = i; usedp[i] = 0; }
int ret = 0;
for (int i = base; i < end; i++) {
if (usedp[i]) continue;
int pos = (int)(lower_bound(pool + i + 1, pool + end, X - pool[i]) - pool);
pos = findn(pos, end);
if (pos < end) {
nxtp[i] = findn(i + 1, end);
nxtp[pos] = findn(pos + 1, end);
usedp[i] = usedp[pos] = 1;
formed++;
if (formed >= target) { sp = base; return 0; }
} else {
ret = pool[i];
}
}
sp = base;
return ret;
}
static char ib[1 << 22], ob[32];
static char *gp;
static inline int rd() { while (*gp < '0') gp++; int v = 0; while (*gp >= '0' && *gp <= '9') v = v * 10 + (*gp++ - '0'); return v; }
int main() {
int len = (int)fread(ib, 1, sizeof(ib) - 1, stdin);
ib[len] = 0; gp = ib;
int n = rd(), m = rd();
long long total = 0;
for (int i = 1; i < n; i++) {
int a = rd(), b = rd(), w = rd();
ae(a, b, w); ae(b, a, w); total += w;
}
target = m;
int lo = 0, hi = (int)(total / m), ans = 0;
while (lo <= hi) {
int mid = (lo + hi) >> 1;
X = mid; formed = 0; sp = 0;
if (mid == 0) { ans = 0; lo = 1; continue; }
dfs(1, 0);
if (formed >= m) { ans = mid; lo = mid + 1; }
else hi = mid - 1;
}
char *op = ob; int k = 0; char t[16];
while (ans) { t[k++] = (char)('0' + ans % 10); ans /= 10; }
while (k) *op++ = t[--k];
*op++ = '\n';
fwrite(ob, 1, op - ob, stdout);
return 0;
}