/** ____ ____ ____ ____ ____ ____ ||l |||e |||i |||n |||a |||d || ||__|||__|||__|||__|||__|||__|| |/__\|/__\|/__\|/__\|/__\|/__\| **/ #include #define endl '\n' using namespace std; typedef long long ll; const ll maxn = 1000100; ifstream fin("escape.in"); ofstream fout("escape.out"); struct edge { ll to; ll len; edge() { to = 0; len = 0; } edge(ll _to, ll _len) { to = _to; len = _len; } bool operator < (const edge &e) const { return len > e.len; } }; vector < ll > v[maxn]; ll n, m, s, used1[maxn], used2[maxn], e[maxn], where[maxn]; unsigned a, b; void find_path(ll beg, ll cnt = 1) { if (where[beg] == 0) { fout << cnt << endl; fout << beg << " "; return; } find_path(where[beg], cnt + 1); fout << beg << " "; } void solve() { fin >> n >> m >> a >> b >> s; for (ll i = 1; i <= n; i ++) v[i].clear(), used1[i] = 0, used2[i] = 0, where[i] = 0; for (ll i = 1; i <= m; i ++) { ll f1, f2; fin >> f1 >> f2; v[f1].push_back(f2); v[f2].push_back(f1); } ll k; fin >> k; for (ll i = 1; i <= k; i ++) fin >> e[i]; queue < ll > q; q.push(e[1]); used1[e[1]] = 1; while(!q.empty()) { ll cur = q.front(); q.pop(); ll sz = v[cur].size(); for (ll i = 0; i < sz; i ++) { ll nb = v[cur][i]; if (!used1[nb]) { used1[nb] = used1[cur] + 1; q.push(nb); } } } q.push(s); used2[s] = 1; while(!q.empty()) { ll cur = q.front(); q.pop(); ll sz = v[cur].size(); ll sf = (ll)(used2[cur] - 1) * b + b; for (ll i = 0; i < sz; i ++) { ll nb = v[cur][i]; ll p = (ll)(used1[cur] - 1) * a; if (!used2[nb] && sf < p) { used2[nb] = used2[cur] + 1; where[nb] = cur; q.push(nb); } } } for (ll i = 1; i <= k; i ++) { if (used2[e[i]] != 0) { find_path(e[i]); fout << endl; return; } } fout << -1 << endl; } int main() { ll t; fin >> t; while(t --) solve(); return 0; } /** 2 7 8 3 2 1 1 2 1 3 2 3 2 4 3 4 4 5 2 6 3 7 3 5 6 7 7 8 3 2 1 1 2 1 3 2 3 2 4 3 4 4 5 4 6 4 7 3 5 6 7 */