#include <iostream>
#include <cmath>
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
#include <algorithm>

using namespace std;

int n, p, sz, A[55], vis[1005], B[52][52], adj[1005][1005];

bool bfs()
{
    queue < int > q;
    memset(vis, -1, sizeof(vis));
    q.push(0);
    vis[0] = 0;
    bool ok = false;
    while(!q.empty())
    {
        int temp = q.front();       q.pop();

        for(int i = 0;i < sz;++i)
        {
            if(vis[i] == -1 and adj[temp][i] > 0)
            {
                vis[i] = temp;
                q.push(i);
                if(i == sz - 1)
                {
                    ok = true;
                    break;
                }
            }
        }
    }
    if(!ok)         return false;

    int temp = sz - 1;
    while(vis[temp] != temp)
    {
        int prev = vis[temp];
        adj[prev][temp] -= 1;
        adj[temp][prev] += 1;
        temp = prev;
    }
    return true;
}

int main()
{
//    freopen("B-large-practice.in", "r", stdin);
//    freopen("out.out", "w", stdout);

    int t, c = 0;
    scanf("%d", &t);
    while(t--)
    {
        ++c;
        scanf("%d%d", &n, &p);
        sz = n * p + 2;

        for(int i = 0;i < n;++i)
            scanf("%d", A + i);

        for(int i = 0;i < n;++i)
            for(int j = 0;j < p;++j)
                scanf("%d", &B[i][j]);


        ///from src
        for(int i = 0;i < p;++i)
        {
            int t = B[0][i];
            int ma = floor(t * 10.0 / (A[0] * 9.0));
            int mi = ceil(t * 10.0 / (A[0] * 11.0));

            if(mi <= ma)
                adj[0][i + 1] = 1;
        }

        ///between packages
        for(int i = 0;i < n - 1;++i)
        {
            for(int j = 0;j < p;++j)
            {
                int t1 = B[i][j];
                int ma1 = floor(t1 * 10.0 / (A[i] * 9.0));
                int mi1 = ceil(t1 * 10.0 / (A[i] * 11.0));

                for(int k = 0;k < p;++k)
                {
                    int t2 = B[i + 1][k];
                    int ma2 = floor(t2 * 10.0 / (A[i + 1] * 9.0));
                    int mi2 = ceil(t2 * 10.0 / (A[i + 1] * 11.0));

                    if(mi1 <= ma1 and mi2 <= ma2 and ((mi2 >= mi1 and mi2 <= ma1) or (ma2 >= mi1 and ma2 <= ma1)))
                        adj[p * i + j + 1][p * (i + 1) + k + 1] = 1;
                }
            }
        }

        ///to dest
        for(int i = 0;i < p;++i)
        {
            int t = B[n - 1][i];
            int ma = floor(t * 10.0 / (A[n - 1] * 9.0));
            int mi = ceil(t * 10.0 / (A[n - 1] * 11.0));

            if(mi <= ma)
                adj[p * (n - 1) + i + 1][sz - 1] = 1;
        }
        int ans = 0;
        while(bfs())
            ++ans;

        printf("Case #%d: %d\n", c, ans);
        memset(adj, 0, sizeof(adj));
    }
    return 0;
}
