#include <bits/stdc++.h>
using namespace std;

#define MAXN 210

int a[MAXN], b[MAXN], c[MAXN];
int dp[MAXN][10010];
bool vis[MAXN];
const int INF = 1e9;
vector<pair<int, int> > s[MAXN];
 
int main()
{
    int T, n, m, M;
    scanf("%d", &T);
    for (int cas = 1; cas <= T; ++cas)
    {
        printf("Case #%d: ", cas);
        memset(vis, 0, sizeof(vis));
        scanf("%d %d %d", &M, &n, &m);
        for (int i = 1; i <= n; ++i)
        {
            int op;
            scanf("%d", &op);
            if (op == 1)
            {
               scanf("%d %d", &a[i], &b[i]);
            }
            else
            {
                a[i] = M + 1;
                scanf("%d", &b[i]);
            }
        }
        for (int i = 1; i <= m; ++i)
        {
            int y, z, k;
            scanf("%d", &c[i]);
            scanf("%d", &k);
            while (k--) scanf("%d %d", &y, &z), s[i].push_back(make_pair(y, z));
        }
        for (int i = 1; i < n; ++i)
        {
            int k, mincost = INF;
            for (int j = 1; j <= n; ++j)
                if (!vis[j] && a[j] < mincost)
                    mincost = a[j], k = j;
            vis[k] = true;
            if (mincost > M) break;
            //cout << k << " "<<mincost << endl;            
            for (int j = 1; j <= m; ++j)
            {
                if (vis[c[j]]) continue;
                bool flag = true;
                long long sum = 0;
                for (auto v: s[j])
                {
                    if (!vis[v.first]) 
                    {
                        flag = false;
                        break;   
                    }
                    sum += 1ll * a[v.first] * v.second;
                }
                if (flag == false) continue;
                //cout << "sss " << j << " "<< sum << endl;
                if (sum <= M)
                    a[c[j]] = min(a[c[j]], (int)sum);
            }
        } 
        memset(dp, 0, sizeof(dp));
        for (int i = 1; i <= n; ++i)
        {
            for (int j = 0; j <= M; ++j)
            {
                dp[i][j] = dp[i - 1][j];
                if (j >= a[i]) dp[i][j] = max(dp[i][j], dp[i][j - a[i]] + b[i]);
            }
        }
        //for (int i = 1; i <= n; ++i)
        //    cout << i << " " << a[i] << " " << b[i] << endl;
        printf("%d\n", dp[n][M]);
        for (int i = 1; i <= m; ++i) s[i].clear();
       // cout << cas << " " << T << endl;
    }
    
    return 0;
}
