#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=4*1e4+10;
int fa[maxn],l,r,n,m,num,cnt,k;
struct edge{
int x,y,w,cur;
}s[maxn];
bool cmp(edge a,edge b){
if(a.cur!=b.cur) return a.cur<b.cur;
return a.w<b.w;
}
int find(int x){
return fa[x]==x?fa[x]:fa[x]=find(fa[x]);
}
bool check(int x){
num=0; int f=0,num1=0;
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=cnt;i++){
if(num1==n-1){
f=true;
break;
}
else{
if(s[i].w<=x){
int fx=find(s[i].x),fy=find(s[i].y);
if(fx==fy) continue;
else{
fa[fx]=fy;
if(s[i].cur==1) ++num;
++num1;
}
}
}
}
if(f&&num>=k) return true;
return false;
}
int main(){
scanf(“%d%d%d”,&n,&k,&m);
for(int i=1;i<m;i++){
int a,b,c,d;
scanf(“%d%d%d%d”,&a,&b,&c,&d);
s[++cnt].x=a; s[cnt].y=b; s[cnt].w=c; s[cnt].cur=1;
s[++cnt].x=a; s[cnt].y=b; s[cnt].w=d; s[cnt].cur=2;
}
sort(s+1,s+1+cnt,cmp);
int ans=0,l=0,r=30001;
while(l<=r){
int mid=l+(r-l)/2;
if(check(mid)){
ans=mid;
r=mid-1;
}
else{
l=mid+1;
}
}
cout<<ans<<endl;
return 0;
}