using System; using static System.Console; using System.Linq; using System.Collections.Generic; class Program { static int NN => int.Parse(ReadLine()); static int[] NList => ReadLine().Split().Select(int.Parse).ToArray(); static int[] NMi => ReadLine().Split().Select(c => int.Parse(c) - 1).ToArray(); static int[][] NMap(int n) => Enumerable.Repeat(0, n).Select(_ => NMi).ToArray(); public static void Main() { Solve(); } static void Solve() { var t = NN; var ans = new bool[t]; for (var u = 0; u < t; ++u) { var c = NList; var (n, k) = (c[0], c[1]); var map = NMap(n - 1); var a = NList; ans[u] = Rooted(n, k, map, a); } WriteLine(string.Join("\n", ans.Select(f => f ? "K" : "P"))); } static bool Rooted(int n, int k, int[][] map, int[] a) { var tree = new List[n]; for (var i = 0; i < tree.Length; ++i) tree[i] = new List(); foreach (var edge in map) { tree[edge[0]].Add(edge[1]); tree[edge[1]].Add(edge[0]); } var len = Enumerable.Repeat(int.MaxValue / 2, n).ToArray(); len[0] = 0; var q = new Queue(); q.Enqueue(0); while (q.Count > 0) { var cur = q.Dequeue(); foreach (var next in tree[cur]) { if (len[next] <= len[cur] + 1) continue; len[next] = len[cur] + 1; q.Enqueue(next); } } var g = 0; for (var i = 0; i < n; ++i) if (len[i] % 2 == 1) g ^= a[i] % (k + 1); return g != 0; } }