#include <bits/stdc++.h>
using namespace std;
#define int long long
#define el cout<<'\n'
const int maxn=1e5+10;
int n,m,ans,father[maxn],tmp=0,need,ans2;
struct bian{
int a,b,len,cd,col;
}pos[maxn];
bool cmp(bian a,bian b) {
if(a.cd==b.cd) return a.col>b.col;
return a.cd<b.cd;
}
int find(int cnt) {
if(father[cnt]==cnt) return cnt;
else {
father[cnt]=find(father[cnt]);
return father[cnt];
}
}
int check(int add) {
int ret=0;ans=0,tmp=0;
for(int i=1;i<=m;i++) {
if(pos[i].col==0) pos[i].cd=pos[i].len+add;
else pos[i].cd=pos[i].len;
}
for(int i=1;i<=n;i++) father[i]=i;
sort(pos+1,pos+m+1,cmp);
for(int i=1;i<=m;i++) {
if(find(pos[i].a)!=find(pos[i].b)) {
tmp++;
ans+=pos[i].len;
father[find(pos[i].a)]=father[find(pos[i].b)];
if(pos[i].col==0) ret++;
if(tmp==n-1) break;
}
}
return ret;
}
signed main() {
cin>>n>>m>>need;
for(int i=1;i<=m;i++) {
cin>>pos[i].a>>pos[i].b>>pos[i].len>>pos[i].col;
pos[i].a++,pos[i].b++;
}
int l=-114,r=114,mid=1919810;
while(l<=r) {
mid=l+(r-l)/2;
if(check(mid)<need) r=mid-1;
else {
ans2=ans;
l=mid+1;
}
}
cout<<ans2;el;
return 0;
}