#include<bits/stdc++.h>
// #include <sys/resource.h>

#define ll long long
// #define ll int
#define f(i,a,b) for(int i=a;i<b;i++)
#define mod 1000000007
// #define mod 998244353 
#define mp make_pair
#define uniq(v) (v).erase(unique(all(v)),(v).end())
#define ff first
#define ss second
#define rf(i,a,b) for(int i=a;i>=b;i--)
#define sc(a) scanf("%lld",&a)
#define pf printf
#define sz(a) (int)(a.size())
#define psf push_front
#define ppf pop_front
#define ppb pop_back
#define pb push_back
#define pq priority_queue
#define all(s) s.begin(),s.end()
#define sp(a) setprecision(a)
#define rz resize
#define ld long double
#define inf (ll)1e18
#define ub upper_bound
#define lb lower_bound
#define bs binary_search
#define eb emplace_back
const double pi = acos(-1);
ll binpow(ll a, ll b){ll res=1;while(b!=0){if(b&1)res*=a;a*=a;b>>=1;}return res;}
// ll binpow(ll a, ll b, ll md){ll res=1;a%=mod;while(b!=0){if(b&1)res*=a,res%=md;a*=a,a%=md;b>>=1;}return res%md;}
 
using namespace std;

const int N=512;
int n,timer=0;
vector<vector<int> > v;
vector<int> st,en,a,freq,tot,cnt;
vector<bool> vis;
 
void dfs(int cur, int parent)
{
    st[cur]=timer++;
    a.pb(cur);
    f(i,0,sz(v[cur]))
    {
        int node=v[cur][i];
        if(node!=parent)
            dfs(node,cur);
    }
    en[cur]=timer-1;
}

struct Query {
    int l, r, idx;
    bool operator<(Query other) const
    {
        return make_pair(l / N, r) <
               make_pair(other.l / N, other.r);
    }
};

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    // freopen("input.txt","r",stdin);
    // freopen("output.txt","w",stdout);
// #ifndef ONLINE_JUDGE
    // freopen("chainblock_input.txt","r",stdin);
    // freopen("output.txt","w",stdout);
// #endif
    int z=1;
    cin>>z;
    int mx=0;
    f(i,1,z+1)
    {
        timer=0;
        cout<<"Case #"<<i<<": ";
        cin>>n;
        v.clear(),st.clear(),en.clear(),freq.clear(),cnt.clear();
        v.rz(n+2),st.rz(n+2),en.rz(n+2),freq.rz(n+2),cnt.rz(n+2);
        f(j,0,n-1)
        {
            int l,r;
            cin>>l>>r;
            v[l].pb(r),v[r].pb(l);
        }
        f(i,1,n+1)
        {
            cin>>freq[i];
            cnt[freq[i]]++;
        }
        dfs(1,1);
        tot.clear();
        tot.rz(n+1);
        vector<Query> queries;
        f(i,2,n+1)
            queries.pb({st[i],en[i],i-2});
        sort(all(queries));
        int cur_l = 0;
        int cur_r = -1,ans=0,cur=0;
        for (Query q : queries) {
            while (cur_l > q.l) {
                cur_l--;
                // add(cur_l);
                int fr=freq[a[cur_l]];
                if(tot[fr]==0)
                    cur++;
                tot[fr]++;
                if(tot[fr]==cnt[fr])
                    cur--;
            }
            while (cur_r < q.r) {
                cur_r++;
                //add(cur_r);
                int fr=freq[a[cur_r]];
                if(tot[fr]==0)
                    cur++;
                tot[fr]++;
                if(tot[fr]==cnt[fr])
                    cur--;
            }
            while (cur_l < q.l) {
                //remove(cur_l);
                int fr=freq[a[cur_l]];
                if(tot[fr]==1)
                    cur--;
                if(tot[fr]==cnt[fr])
                    cur++;
                tot[fr]--;
                cur_l++;
            }
            while (cur_r > q.r) {
                //remove(cur_r);
                int fr=freq[a[cur_r]];
                if(tot[fr]==1)
                    cur--;
                if(tot[fr]==cnt[fr])
                    cur++;
                tot[fr]--;
                cur_r--;
            }
            if(cur==0)
                ans++;
        }
        cout<<ans<<"\n";
        a.clear();
    }
} 