1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<cstdlib>
5 #include<cmath>
6 #include<ctime>
7 #include<algorithm>
8 #define rep(i,l,r) for(int i=l;i<r;i++)
9 #define clr(a,x) memset(a,x,sizeof(a))
10 using namespace std;
11 const int maxn=10050,maxm=20050;
12 int f[maxn];
13 int find(int a)
14 {
15 return f[a]==a?a:f[a]=find(f[a]);
16 }
17 int read()
18 {
19 int ans=0;
20 char c=getchar();
21 while(!isdigit(c)) c=getchar();
22 while(isdigit(c)){
23 ans=ans*10+c-‘0‘;
24 c=getchar();
25 }
26 return ans;
27 }
28 struct edge{
29 int from,to,v;
30 bool t;
31 inline bool operator<(const edge&edge1)const{
32 return v<edge1.v;
33 }
34 };
35 edge e[maxm<<1];
36 int main()
37 {
38 int ans=0,n=read(),k=read(),m=read();
39 rep(i,1,n+1) f[i]=i;
40 rep(i,0,m-1){
41 e[i].from=read();e[i].to=read();e[i].v=read();e[i].t=1;
42 int r=i+m-1;
43 e[r].from=e[i].from;e[r].to=e[i].to;e[r].v=read();e[r].t=0;
44 }
45 m=m*2-2;
46 sort(e,e+m);
47 int cnt=0;
48 rep(i,0,m){
49 if(cnt==k) break;
50 if(e[i].t){
51 if(find(e[i].from)!=find(e[i].to)) cnt++;
52 f[find(e[i].from)]=find(e[i].to);
53 ans=max(ans,e[i].v);
54 }
55 }
56 rep(i,0,m){
57 if(cnt==n-1) break;
58 if(find(e[i].from)!=find(e[i].to)){
59 cnt++;ans=max(ans,e[i].v);
60 f[find(e[i].from)]=find(e[i].to);
61 }
62 }
63 printf("%d",ans);
64 return 0;
65 }