#include using namespace std; const int nmax=1e6+42; int n,m,a,b,inp[nmax]; int dist[2][nmax]; queue< pair > q; vector adj[nmax]; bool valid(char c) { return '0'<=c&&c<='9'; } void read_int(int &ret) { ret=0; char c=getchar(); while(valid(c)==0)c=getchar(); while(valid(c)) { ret=ret*10+c-'0'; c=getchar(); } } void bfs(int id,int start) { for(int i=1;i<=n;i++)dist[id][i]=-1; q.push({start,0}); while(q.size()) { pair st=q.front(); q.pop(); if(dist[id][st.first]!=-1)continue; dist[id][st.first]=st.second; for(auto k:adj[st.first]) q.push({k,st.second+1}); } } bool been[nmax],out[nmax]; bool solved; int path[nmax],pointer=0; bool CAN[nmax]; void go(int node) { if(solved)return; pointer++; path[pointer]=node; if(out[node]) { printf("%i\n",pointer); printf("%i",path[1]); for(int i=2;i<=pointer;i++)printf(" %i",path[i]); printf("\n"); solved=1; pointer--; return; } if(been[node]) { pointer--; return; } been[node]=1; for(auto w:adj[node]) if(CAN[w]&&dist[0][node]+1==dist[0][w])go(w); pointer--; } void solve() { pointer=0; int s; scanf("%i%i%i%i%i",&n,&m,&a,&b,&s); for(int i=1;i<=n;i++)adj[i]={}; for(int i=1;i<=m;i++) { int u,v; read_int(u); read_int(v); adj[u].push_back(v); adj[v].push_back(u); } for(int i=1;i<=n;i++)out[i]=0; int k,e; scanf("%i",&k); for(int i=1;i<=k;i++) { int c; read_int(c); if(i==1)e=c; out[c]=1; } bfs(0,s); bfs(1,e); if(dist[1][s]==0) { printf("-1\n"); return; } pointer=0; solved=0; for(int i=1;i<=n;i++)been[i]=0; for(int i=1;i<=n;i++) CAN[i]=(1LL*b*dist[0][i]<1LL*a*dist[1][i]); go(s); if(solved==0) { printf("-1\n"); return; } } int main() { freopen("escape.in","r",stdin); freopen("escape.out","w",stdout); int t; scanf("%i",&t); while(t) { t--; solve(); } return 0; }