#include <iostream>
#include <cstdio>
#include <cassert>
#include <cstring>
using namespace std;
#define REP(i, n) for(int i=0; i<int(n); i++)
#define pb(x) push_back(x)
#define MAXN 35
#define eps 1e-6
#define inf (-1e20)
int S, n, m, k, bs;
bool f[MAXN];
double p[6][MAXN];
double dp[1<<16][2];
bool   ok[1<<16][2];
int minn, maxn;
bool check(int mk){
    for(int i=0; i<n; i++, mk>>=bs){
        int t = mk&S;
        if (t > maxn) return false;
        else if (t < minn) return false;
    }
    return true;
}
int sz(int mk){
    int res = 0;
    for(; mk; mk >>= bs)
        res += mk&S;
    return res;
}
double dfs(int mk, int pre){
    int x = sz(mk);
    if (x>=m) return check(mk)?0:inf;
    if (ok[mk][pre]) return dp[mk][pre];
    double res=inf;
    REP(i, n){
        if(((mk>>(bs*i))&S)+1>maxn)continue;
        double tmp=inf;
        int st = mk + (1<<(i*bs));
        if (f[x]&&!pre) tmp = dfs(st, 0);
        else tmp = p[i][x] * (1 + dfs(st, 1)) + (1 - p[i][x]) * dfs(st, 0);
        res = max(res, tmp);
    }
    dp[mk][pre]=res; ok[mk][pre]=true;
    if (!f[x]) dp[mk][pre^1]=res, ok[mk][pre^1]=true;
    return res;
}
int main()
{
    int T, x;
    scanf("%d", &T);
    REP(tt, T){
        memset(f, 0, sizeof f);
        memset(ok, 0, sizeof ok);
        cin>>n>>m>>k;
        minn = m/n; maxn = (m-1)/n + 1;
        bs = 4;
        while ((1<<(bs-1))>maxn) bs--;
        S = (1<<bs)-1;
        REP(i, k){
            scanf("%d", &x);
            f[x-1] = true;
        }
        REP(i, n) REP(j, m)
            scanf("%lf", p[i]+j);
        double ans = dfs(0, 0);
        printf("Case %d: %.4lf\n", tt+1, ans);
    }
    return 0;
}
