70pts:WA #8#9#13
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int N=1005;
int f,p,c,m;
int G[N][N],dist[N],x[N];
bool vis[N];
void dijk(){
queue<int>q; q.push(1);
memset(dist,0x3f,sizeof dist); dist[1]=0;
while(!q.empty()){
int u=q.front(); q.pop();
for(int i=1;i<=f;i++){
if(G[u][i]!=0x3f3f3f3f){
if(vis[i]==1)continue;
vis[i]=1;
dist[i]=min(dist[i],dist[u]+G[u][i]);
q.push(i);
}
}
}
}
void point(){//判断路程能否在m秒内到达1号农场
int cnt=0;
for (int i=1;i<=c;i++){
if(dist[x[i]] <= m) cnt++;
}
cout<<cnt<<endl;
for (int i=1;i<=c;i++){
if(dist[x[i]] <= m) cout<<i<<endl;
}
}
void solve(){
dijk();
point();
}
int main(){
cin>>f>>p>>c>>m;
memset(G,0x3f,sizeof (G));
for(int i=1;i<=p;i++){
int u,v,w;
cin>>u>>v>>w;
G[u][v]=min(G[u][v],w);//存最小边
G[v][u]=min(G[v][u],w);
}
for(int i=1;i<=c;i++)cin>>x[i];//牛的位置
solve();
return 0;
}