#include <cstdio>
#include <algorithm>
using namespace std;
int i,aux,n,k,j,p,s,unu,t,m,doi,x,mini,maxi,sol,cont,viz[250010],y,cost,d,cat,pericol;
struct coada
{
int x,y,cat,pericol;
}c[500010];
coada a[500010];
bool cmp(coada i,coada j)
{
if (i.cat == j.cat)
{
return i.pericol < j.pericol;
}
return i.cat < j.cat;
}
bool cmp2(coada i,coada j)
{
return i.pericol > j.pericol;
}
int parinte(int p)
{
if(viz[p]==p )return p;
viz[p]=parinte(viz[p]);
return viz[p];
}
void unite(int i,int j)
{
viz[parinte(i)]=parinte(j);
}
int main()
{
freopen ("politie.in","r",stdin);
freopen ("politie.out","w",stdout);
scanf("%d%d%d%d",&n,&m,&d,&p);
for(i=1;i<=m;i++)
{
scanf("%d %d %d %d",&x,&y,&cat,&pericol);
c[i].x=x;
c[i].y=y;
c[i].cat=cat;
c[i].pericol=pericol;
}
sort(c+1,c+m+1,cmp);
for(i=1;i<=n;i++)
{
viz[i]=i;
//printf("%d %d %d %d\n",c[i].x,c[i].y,c[i].cat,c[i].pericol);
}
for(i=1;i<=m;i++)
{
//printf("%d %d %d %d\n",c[i].x,c[i].y,c[i].cat,c[i].pericol);
}
cont=0;
k=0;
for(i=1;i<=m;i++)
{
if(parinte(c[i].x) != parinte(c[i].y))
{
cont++;
a[cont]=c[i];
unite(c[i].x,c[i].y);
}
}
sort(a+1,a+cont+1,cmp2);
for(i=1;i<=cont;i++)
{
if(p>=1)
{
if(a[i].pericol != a[i-1].pericol)
{
printf("%d\n",a[i].pericol);
p--;
}
}
//printf("%d %d %d %d\n",a[i].x,a[i].y,a[i].cat,a[i].pericol);
}
}