# https://yukicoder.me/problems/no/3291 from collections import deque MAX_VALUE = 2 * 10 ** 18 def main(): N, M, K, s, t = map(int, input().split()) s -= 1 t -= 1 edge_set = set() next_nodes = [[] for _ in range(N)] edge_set for _ in range(M): u, v = map(int, input().split()) next_nodes[u - 1].append(v - 1) next_nodes[v - 1].append(u - 1) u0 = min(u - 1, v - 1) v0 = max(u - 1, v- 1) edge_set.add((u0, v0)) dp_from_start = [[MAX_VALUE] * N for _ in range(2)] dp_from_start[0][s] = 0 queue = deque() queue.append((0, s)) while len(queue) > 0: state, v = queue.popleft() new_state = 1 - state for w in next_nodes[v]: if dp_from_start[new_state][w] == MAX_VALUE: dp_from_start[new_state][w] = dp_from_start[state][v] + 1 queue.append((new_state, w)) k = dp_from_start[0][t] if k <= K and (K - k) % 2 == 0: print("Yes") return k = dp_from_start[1][t] if k <= K and (K - k) % 2 == 0: print("Yes") return # 今度は追加してうまく行くかをみる dp_from_goal0 = [[MAX_VALUE] * N for _ in range(2)] dp_from_goal0[0][t] = 0 queue = deque() queue.append((0, t)) while len(queue) > 0: state, v = queue.popleft() new_state = 1 - state for w in next_nodes[v]: if dp_from_goal0[new_state][w] == MAX_VALUE: dp_from_goal0[new_state][w] = dp_from_goal0[state][v] + 1 queue.append((new_state, w)) dp_from_goal1 = [[MAX_VALUE] * N for _ in range(2)] dp_from_goal1[1][t] = 0 queue = deque() queue.append((1, t)) while len(queue) > 0: state, v = queue.popleft() new_state = 1 - state for w in next_nodes[v]: if dp_from_goal1[new_state][w] == MAX_VALUE: dp_from_goal1[new_state][w] = dp_from_goal1[state][v] + 1 queue.append((new_state, w)) for u0 in range(N): for v0 in range(u0 + 1, N): edge = (u0, v0) if edge not in edge_set: for i0 in range(2): for j0 in range(2): for k in range(2): u = edge[k] v = edge[1 - k] a0 = dp_from_start[i0][u] + 1 + dp_from_goal0[j0][v] if K >= a0 and (K - a0) % 2 == 0: print("Yes") return a0 = dp_from_start[i0][u] + 1 + dp_from_goal1[j0][v] if K >= a0 and (K - a0) % 2 == 0: print("Yes") return print("No") if __name__ == "__main__": main()