1 #include <iostream>
2 #include <stdio.h>
3 #include <string.h>
4 #include <algorithm>
5
6 using namespace std;
7 #define MAXN 10005
8 #define MAXM 20005
9
10 struct Node
11 {
12 int s,e;
13 int v;
14 bool operator < (const Node& b)const {return v<b.v;}
15 }r1[MAXM],r2[MAXM];
16
17 int n,k,m,r1_n,r2_n;
18 int f[MAXN];
19
20 int Find(int x)
21 {
22 if (x!=f[x])
23 f[x]=Find(f[x]);
24 return f[x];
25 }
26
27 int krus(int cost)
28 {
29 for (int i=1;i<=n;i++) f[i]=i;
30
31 int road=0;
32 int L = 1;
33
34 for (int i=0;i<r1_n;i++) //一级公路
35 {
36 if (r1[i].v>cost) break;
37 int xx = Find(r1[i].s);
38 int yy = Find(r1[i].e);
39 if (f[xx]!=f[yy])
40 {
41 road++;
42 f[xx]=f[yy];
43 L++; //连通的个数
44 }
45 if (L==n) break;
46 }
47 for (int i=0;i<r2_n;i++) //二级公路
48 {
49 if (r2[i].v>cost) break;
50 int xx = Find(r2[i].s);
51 int yy = Find(r2[i].e);
52 if (f[xx]!=f[yy])
53 {
54 f[xx]=f[yy];
55 L++; //连通的个数
56 }
57 if (L==n) break;
58 }
59 if (road>=k&&L==n)
60 return 1;
61 return 0;
62 }
63
64 int main()
65 {
66 scanf("%d%d%d",&n,&k,&m);
67 r1_n=0;
68 r2_n=0;
69 for (int i=0;i<m-1;i++)
70 {
71 int a,b,c1,c2;
72 scanf("%d%d%d%d",&a,&b,&c1,&c2);
73 r1[r1_n++]=(Node){a,b,c1};
74 r2[r2_n++]=(Node){a,b,c2};
75 }
76 sort(r1,r1+r1_n);
77 sort(r2,r2+r2_n);
78
79 int l=0,r=30000;
80 int ans;
81
82 while (l<=r)
83 {
84 int mid = (l+r)/2;
85 if (krus(mid))
86 {
87 r=mid-1;
88 ans=mid;
89 }
90 else
91 l=mid+1;
92 }
93 printf("%d\n",ans);
94
95 return 0;
96 }