#include <bits/stdc++.h>
using namespace std;
int f,p,c,m,sum,d[105],vis[105],a[105][105];
int crime[105],chose[105];
void dijkstra(){
memset(d,0x3f,sizeof(d));
memset(vis,0,sizeof(vis));
d[1]=0;//初始化
for(int i=1;i<f;i++){
int s=0;
for(int j=1;j<=f;j++){
if(!vis[j]&&(s==0||d[j]<d[s])) s=j;//提取x数值
}
vis[s]=1;//标记已访问数值
for(int g=1;g<=f;g++) d[g]=min(d[g],d[s]+a[s][g]);
}
}
int main(){
cin>>f>>p>>c>>m;
memset(a,0x3f,sizeof(a));
memset(crime,0,sizeof(crime));
for(int i=1;i<=f;i++) a[i][i]=0;//自己与自己的最短路径==0
for(int i=1;i<=p;i++){
int f1,f2,t;
cin>>f1>>f2>>t;
a[f1][f2]=min(a[f1][f2],t);//判断重复边不同权值
}
dijkstra();//函数
for(int i=1;i<=f;i++){
if(d[i]<=m){
sum++;
crime[i]=d[i];
}
}
cout<<sum;
for(int i=1;i<=sum;i++) chose[crime[i]]++;
for(int i=1;i<=m;i++) while(chose[i]>0) cout<<crime[i]<<endl;//输出嫌疑犯编号
return 0;
}