#include // cout, endl, cin #include // string, to_string, stoi #include // vector #include // min, max, swap, sort, reverse, lower_bound, upper_bound #include // pair, make_pair #include // tuple, make_tuple #include // int64_t, int*_t #include // printf #include // map #include // queue, priority_queue #include // set #include // stack #include // deque #include // unordered_map #include // unordered_set #include // bitset #include // isupper, islower, isdigit, toupper, tolower #include #include #include #include #include #include #include #include //#include using namespace std; using ll=long long; using vll=vector; using vi=vector; using vvi=vector; using P=pair; using vp=vector

; using vvp=vector; #define rep(i,n) for(int i=0; i<(int)(n); i++) #define repi(i,a,b) for(int i=(int)(a); i<(int)(b); i++) #define all(x) (x).begin(),(x).end() #define arr(x) (x).rbegin(),(x).rend() template bool chmin(T&a,const S&b){ return a>b?a=b,1:0; } template bool chmax(T&a,const S&b){ return a> n >> k; vvi g(n); rep(i,n-1){ int a,b; cin >> a >> b; a--;b--; g[a].push_back(b); g[b].push_back(a); } vi a(n); rep(i,n)cin >> a[i]; int grad=0; auto dfs=[&](auto dfs,int v,int p,int d)->void{ if(d){ grad^=a[v]%(k+1); } for(auto u:g[v]){ if(u==p)continue; dfs(dfs,u,v,d^1); } }; dfs(dfs,0,-1,0); if(grad){ cout << "K" << endl; } else { cout << "P" << endl; } } int main(){ int t=1; cin >> t; rep(test,t)solve(test); }