import sys,collections,heapq from collections import deque sys.setrecursionlimit(10**7) def I(): return int(sys.stdin.readline().rstrip()) def MI(): return map(int,sys.stdin.readline().rstrip().split()) def LI(): return list(map(int,sys.stdin.readline().rstrip().split())) def LI2(): return list(map(int,sys.stdin.readline().rstrip())) def S(): return sys.stdin.readline().rstrip() def LS(): return list(sys.stdin.readline().rstrip().split()) def LS2(): return list(sys.stdin.readline().rstrip()) N,M,P = MI() S,G = MI() Graph = [[[] for _ in range(2)] for _ in range(N+1)] for _ in range(M): u,v = MI() Graph[u][0].append((v,1)) Graph[v][0].append((u,1)) Graph[u][1].append((v,0)) Graph[v][1].append((u,0)) inf = 10**18 dist_S = [[inf]*2 for _ in range(N+1)] dist_G = [[inf]*2 for _ in range(N+1)] dist_S[S][0] = 0 dist_G[G][0] = 0 deq_S = deque([(S,0)]) deq_G = deque([(G,0)]) while deq_S: u,r = deq_S.pop() for v,s in Graph[u][r]: if dist_S[v][s] == inf: dist_S[v][s] = dist_S[u][r]+1 deq_S.appendleft((v,s)) while deq_G: u,r = deq_G.pop() for v,s in Graph[u][r]: if dist_G[v][s] == inf: dist_G[v][s] = dist_G[u][r]+1 deq_G.appendleft((v,s)) ANS = [] for i in range(1,N+1): if P % 2 == 0: d0 = dist_S[i][0]+dist_G[i][0] d1 = dist_S[i][1]+dist_G[i][1] if (d0 != inf and d0 <= P) or (d1 != inf and d1 <= P): ANS.append(i) else: d0 = dist_S[i][0]+dist_G[i][1] d1 = dist_S[i][1]+dist_G[i][0] if (d0 != inf and d0 <= P) or (d1 != inf and d1 <= P): ANS.append(i) if ANS: print(len(ANS)) print(*ANS,sep='\n') else: print(-1) # DijkstraだとTLE