rt.
#include<bits/stdc++.h>
using namespace std;
int n,m,fa[200005],need;
struct edge{
int u,v,w,id;
friend bool operator < (edge a,edge b){
return a.w<b.w;
}
};
edge e[200005],mst[200005];
int Find(int x){
if(fa[x]!=x) return fa[x] = Find(fa[x]);
else return fa[x];
}
void Union(int u,int v){
int fu = Find(u);
int fv = Find(v);
if(fu!=fv) fa[fv] = fu;
}
pair<int,int> check(int Snoozing_QwQ){
for(int i = 1;i<=m;i++) e[i].w+=(1-e[i].id)*Snoozing_QwQ;
for(int i = 1;i<=n;i++) fa[i] = i;
sort(e+1,e+1+m);
for(int i = 1;i<=m;i++) e[i].w-=(1-e[i].id)*Snoozing_QwQ;
int ans = n-1,QwQ = 0;
for(int i = 1;i<=m;i++)
if(Find(e[i].u)!=Find(e[i].v)){
QwQ+=e[i].w;
ans-=e[i].id;
Union(e[i].u,e[i].v);
}
return pair<int,int>{ans,QwQ};
}
int main(){
cin >> n >> m >> need;
for(int i = 1;i<=m;i++) cin >> e[i].u >> e[i].v >> e[i].w >> e[i].id,e[i].u++,e[i].v++;
int l = -105,r = 105,mid,ans = 1145141919;
while(l<=r){
mid = (l+r)>>1;
pair<int,int> p = check(mid);
if(p.first<need) r = mid-1;
else if(p.first==need){
r = mid-1,ans = min(ans,p.second);
}else l = mid+1;
}
cout << ans;
return 0;
}