#include using namespace std; using ll = long long; using ld = long double; using db = double; using str = string; // yay python! using pi = pair; using pl = pair; using pd = pair; using vi = vector; using vb = vector; using vl = vector; using vd = vector; using vs = vector; using vpi = vector; using vpl = vector; using vpd = vector; #define tcT template using V = vector; tcT, size_t SZ> using AR = array; tcT> using PR = pair; // pairs #define mp make_pair #define f first #define s second // vectors #define sz(x) (int)(x).size() #define all(x) begin(x), end(x) #define rall(x) (x).rbegin(), (x).rend() #define sor(x) sort(all(x)) #define rsz resize #define ins insert #define ft front() #define bk back() #define pf push_front #define pb push_back #define eb emplace_back #define lb lower_bound #define ub upper_bound // loops #define FOR(i,a,b) for (int i = (a); i < (b); ++i) #define F0R(i,a) FOR(i,0,a) #define ROF(i,a,b) for (int i = (b)-1; i >= (a); --i) #define R0F(i,a) ROF(i,0,a) #define trav(a,x) for (auto& a: x) const int MOD = 1e9+7; // 998244353; const int mxN = 1e6+5; const ll INF = 1e18; ifstream in; ofstream out; int n, m, s, s2, par[mxN]; ll a[2]; vi grph[mxN]; bool iz[mxN]; ll dist[2][mxN]; void dfs(int st, int ty) { queue q; q.push(st); for(int i = 1; i <= n; i++) { dist[ty][i] = INF; } par[st] = 0; dist[ty][st] = 0; while(!q.empty()) { auto t = q.front(); q.pop(); if(ty == 0 && dist[0][t] >= dist[1][t]) { continue; } trav(x, grph[t]) { if(dist[ty][x] > dist[ty][t] + a[ty]) { par[x] = t; dist[ty][x] = dist[ty][t] + a[ty]; q.push(x); } } } } void solve() { dfs(s2, 1); dfs(s, 0); for(int i = 1; i <= n; i++) { if(iz[i] && dist[0][i] != INF) { int st = i; out << (dist[0][st] / a[0]) + 1 << "\n"; stack sta; while(st != 0) { sta.push(st); st = par[st]; } while(!sta.empty()) { out << sta.top() << " "; sta.pop(); } out << "\n"; return; } } out << "-1\n"; } int main() { //setIO(); in.open("escape.in"); out.open("escape.out"); int t; in >> t; while(t--) { in >> n >> m >> a[1] >> a[0] >> s; int v, w; for(int i = 1; i <= n; i++) { grph[i].clear(); iz[i] = 0; } FOR(i, 0, m) { in >> v >> w; grph[v].pb(w); grph[w].pb(v); } int k; in >> k; int h; for(int i = 0; i < k; i++) { in >> h; if(!i) s2 = h; iz[h] = 1; } solve(); } out.close(); in.close(); return 0; // you should actually read the stuff at the bottom } /* stuff you should look for * int overflow, array bounds * special cases (n=1?) * do smth instead of nothing and stay organized * WRITE STUFF DOWN * DON'T GET STUCK ON ONE APPROACH */