//....................................<In the name of Allah>...............................//
//.................................<b_bitsmillahir Rahmanir Rahim>...................................//
// Author : Riaj Udd_bitn
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef vector<ll> vl;
typedef pair<ll, ll> pii;
typedef pair<double, double> pdd;
typedef double dl;
#define lower(a, b) lower_bound((a).begin(), (a).end(), b) - (a).begin()
#define mem(a, b) memset(a, b, sizeof(a));
#define all(a) (a).begin(), (a).end()
#define rall(a) (a).rbegin(), (a).rend()
#define fraction(a) \
cout.unsetf(ios::floatfield); \
cout.precision(a); \
cout.setf(ios::fined, ios::floatfield);
//////////////////////////////////////////
template <typename F, typename S>
ostream &operator<<(ostream &os, const pair<F, S> &p)
{
return os << "(" << p.first << ", " << p.second << ")";
}
template <typename T>
ostream &operator<<(ostream &os, const vector<T> &v)
{
os << "{";
for (auto it = v.begin(); it != v.end(); ++it)
{
if (it != v.begin())
os << ", ";
os << *it;
}
return os << "}";
}
template <typename T>
ostream &operator<<(ostream &os, const set<T> &v)
{
os << "[";
for (auto it = v.begin(); it != v.end(); ++it)
{
if (it != v.begin())
os << ", ";
os << *it;
}
return os << "]";
}
template <typename T>
ostream &operator<<(ostream &os, const multiset<T> &v)
{
os << "[";
for (auto it = v.begin(); it != v.end(); ++it)
{
if (it != v.begin())
os << ", ";
os << *it;
}
return os << "]";
}
template <typename F, typename S>
ostream &operator<<(ostream &os, const map<F, S> &v)
{
os << "[";
for (auto it = v.begin(); it != v.end(); ++it)
{
if (it != v.begin())
os << ", ";
os << it->first << " = " << it->second;
}
return os << "]";
}
#define dbg(args...) \
do \
{ \
cerr << #args << " : "; \
faltu(args); \
} while (0)
void faltu()
{
cerr << endl;
}
template <typename T>
void faltu(T a[], ll n)
{
for (ll i = 0; i < n; ++i)
cerr << a[i] << ' ';
cerr << endl;
}
template <typename T, typename... hello>
void faltu(T arg, const hello &...rest)
{
cerr << arg << ' ';
faltu(rest...);
}
///////////b_bitt-manipulation///////////////
#define Mb(msk) 63 - __builtin_clzll(msk)
#define Lb(msk) __builtin_ctzll(msk)
#define ONE(msk) __builtin_popkll(msk)
#define CHECK(msk, b_bitt) (msk & (1LL << b_bitt))
#define ON(msk, b_bitt) (msk | (1LL << b_bitt))
#define Off(msk, b_bitt) (msk & ~(1LL << b_bitt))
#define CHANGE(msk, b_bitt) (msk ^ (1LL << b_bitt))
//////////////
const ll N = 3e5 + 9;
template <class T>
struct BIT
{ // 1-indexed
ll n;
vector<T> t, t1;
BIT() {}
BIT(ll _n)
{
n = _n;
t.assign(n + 1, 0);
}
T query(ll i)
{
T ans = 0;
for (; i; i -= (i & -i))
ans ^= t[i];
return ans;
}
void upd(ll i, T val)
{
if (i <= 0)
return;
for (; i <= n; i += (i & -i))
t[i] ^= val;
}
void upd(ll l, ll r, T val)
{
upd(l, val);
upd(r + 1, -val);
}
T query(ll l, ll r)
{
return query(r) - query(l - 1);
}
};
vector<ll> g[N];
ll li[N], in[N], out[N];
ll tim = 0;
void dfs(ll node, ll par)
{
in[node] = ++tim;
for (auto u : g[node])
{
if (u != par)
{
dfs(u, node);
}
}
out[node] = tim;
}
void solve(int tc)
{
ll n, q;
cin >> n >> q;
for (ll i = 0; i < n; i++)
cin >> li[i];
for (ll i = 0; i < n - 1; i++)
{
ll u, v;
cin >> u >> v;
u--, v--;
g[u].push_back(v);
g[v].push_back(u);
}
dfs(0, -1);
BIT<ll> bt(2 * n);
for (int i = 1; i <= q; i++)
{
ll nd;
cin >> nd;
nd--;
bt.upd(in[nd], 1);
bt.upd(out[nd] + 1, 1);
}
for (ll i = 0; i < n; i++)
{
li[i] ^= (bt.query(in[i]) % 2);
}
cout << "Case " << tc << ": ";
for (ll i = 0; i < n; i++)
cout << li[i] << " ";
cout << "\n";
for (ll i = 0; i <= n; i++)
{
g[i].clear();
in[i] = out[i] = li[i] = 0;
}
tim = 0;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
ll t = 1, cs = 0;
cin >> t;
for (int tc = 1; tc <= t; tc++)
{
solve(tc);
}
}