#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair <ll, int> pli;
typedef pair <int, int> pii;
typedef pair <ll, ll> pll;
#define fr first
#define sc second
#define sz(x) int(x.size())
#define all(x) x.begin(), x.end()
#define lb lower_bound
#define ub upper_bound
#define ins insert
#define pb push_back
#define mp(a, b) make_pair(a, b)
#define ppb pop_back()
#define mint ModInt
const int mod = 998244353;
const int N = 2e5 + 2, inf = 1e9;
const ll oo = 1e18;
vector <pii> g[N];
vector <int> gr[N], o;
bool u[N];
ll d[N];
int pr[N], a[N], b[N], c[N], n, m, k, s;
vector <int> arr;
void dfs(int v){
	u[v] = 1;
	o.pb(v);
	for(auto to : gr[v]){
		if(!u[to])dfs(to);
	}
}
void regular_dj(vector <int> list){
	set <pli> st;
	fill(d, d + n + 1, oo);
	for(auto to : list){
		st.ins({0, to});
		d[to] = 0;
		pr[to] = to;
	}
	//return;
	while(!st.empty()){
		int v = st.begin() -> sc;
		st.erase(st.begin());
		//cerr << v << endl;
		for(auto it : g[v]){
			int to = it.fr, w = it.sc;
			if(d[to] > d[v] + w){
				st.erase({d[to], to});
				d[to] = d[v] + w;
				pr[to] = pr[v];
				st.ins({d[to], to});
			}
		}
	}
}

void solve(){
	cin >> n >> m >> k >> s;
	for(int i = 1;i <= m; ++ i){
		cin >> a[i] >> b[i] >> c[i];
		g[a[i]].pb({b[i], c[i]});
		g[b[i]].pb({a[i], c[i]});
	}
	//return;
	for(int i = 1;i <= k; ++ i){
		int x;
		cin >> x;
		o.pb(x);
	}
	vector <int> ans;
	//return;
	regular_dj(o);
	o.clear();
	for(int i = 1;i <= m; ++ i){
		if(pr[a[i]] != pr[b[i]] && d[a[i]] + d[b[i]] + c[i] <= s){
			int v = pr[a[i]], to = pr[b[i]];
			gr[v].pb(to);
			gr[to].pb(v);
		}
	}
	dfs(1);
	regular_dj(o);
	for(int i = 1;i <= n; ++ i){
		if(d[i] <= s){
			ans.pb(i);
		}
	}
	cout << sz(ans) << endl;
	for(auto to : ans){
		cout << to << " ";
	}
}

int main(){
	//freopen("input.txt", "r", stdin);
	//freopen("output.txt", "w", stdout);
	ios_base::sync_with_stdio(0);
	int T = 1;
	//cin >> T;
	while(T--){
		solve();
	}
	return 0;
}
