#nullable enable int n, m, s, t; long k; { var input = Console.ReadLine()!.Split(' '); n = int.Parse(input[0]); m = int.Parse(input[1]); k = long.Parse(input[2]); s = int.Parse(input[3]) - 1; t = int.Parse(input[4]) - 1; } var adjacencies = new List[n]; for (var i = 0; i < n; i++) adjacencies[i] = new(); for (var i = 0; i < m; i++) { var input = Console.ReadLine()!.Split(' '); var u = int.Parse(input[0]) - 1; var v = int.Parse(input[1]) - 1; adjacencies[u].Add(v); adjacencies[v].Add(u); } bool Solve() { if (k % 2 != 0) return true; if (adjacencies[s].Exists(v => v != t)) return true; if (adjacencies[t].Exists(v => v != s)) return true; if (!adjacencies[s].Contains(t)) return false; var max = int.MaxValue / 2; for (var o = 0; o < n; o++) { var closest = new int[n]; closest.AsSpan().Fill(max); closest[o] = 0; var q = new Queue(); q.Enqueue(o); while (q.Count > 0) { var v = q.Dequeue(); var nv = closest[v] + 1; foreach (var next in adjacencies[v]) { var cv = closest[next]; if (cv < max) { var ret = nv + cv; if (ret % 2 != 0 && ret + 3 <= k) return true; } if (nv < cv) { closest[next] = nv; q.Enqueue(next); } } } } return false; } Console.WriteLine(Solve() ? "Yes" : "No");