#include<bits/stdc++.h>
using namespace std;
const int MAXN=50010;
int n,m;
int a,b,l,dp[MAXN],len[MAXN];
struct daduoli {
int f,t,c;
}que[MAXN*2];
int cnt,h[MAXN];
void add(int f,int t,int c) {
++cnt;
que[cnt].f=h[f];
que[cnt].t=t;
que[cnt].c=c;
h[f]=cnt;
}
void dfs(int node,int fa,int achieve) {
vector<int> a;
dp[node]=0;
len[node]=0;
for(int i=h[node];i;i=que[i].f) {
int t=que[i].t;
if(t==fa) continue;
dfs(t,node,achieve);
dp[node]+=dp[t];
a.push_back(que[i].c+len[t]);
}
sort(a.begin(),a.end());
int R=a.size();
for(int i=R-1;i>=0;--i) {
if(a[i]>=achieve) ++dp[node],R--;
else break;
}
int nxt[R+2],pre[R+2],r=R-1;
memset(nxt,0,sizeof(nxt));
memset(pre,0,sizeof(pre));
pre[R]=R-1;
bool vis[R+2];
memset(vis,0,sizeof(vis));
vis[0]=0;
for(int i=1;i<R;++i) pre[i]=i-1,vis[i]=0;
for(int i=0;i<R;++i) nxt[i]=i+1;
for(int i=1;i<R;++i) {
if(a[i]+a[0]>=achieve) {
r=i;
break;
}
}
for(int i=0;i<R;++i) {
if(vis[i]) continue;
while(a[i]+a[pre[r]]>=achieve&&pre[r]>i&&!vis[pre[r]])
r=pre[r];
if(a[i]+a[r]>=achieve||i>=r) {
if(i>=r) r=nxt[i];
if(vis[r]||r==R||a[i]+a[r]<achieve) continue;
nxt[pre[r]]=nxt[r];
pre[nxt[r]]=pre[r];
nxt[pre[i]]=nxt[i];
pre[nxt[i]]=pre[i];
vis[i]=1;vis[r]=1;
r=nxt[r];
if(r==R) r=pre[R];
++dp[node];
}
}
for(int i=R-1;i>=0;--i) {
if(!vis[i]) {
len[node]=a[i];
return ;
}
}
}
bool check(int k) {
dfs(1,0,k);
if(dp[1]>=m) return true;
return false;
}
int erfind() {
int l,r=500000001,mid;
while(l+1<r) {
mid=(l+r)/2;
if(check(mid)) l=mid;
else r=mid;
}
return l;
}
int main() {
cin>>n>>m;
for(int i=1;i<n;++i) {
cin>>a>>b>>l;
add(a,b,l);
add(b,a,l);
}
cout<<erfind();
return 0;
}