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

#define int long long
#define pb push_back
#define S second
#define F first
#define f(i, n) for (int i = 1; i <= n; i++)
#define fast                      \
    ios_base::sync_with_stdio(0); \
    cin.tie(0);                   \
    cout.tie(0)
#define vi vector<int>
#define pii pair<int, int>

const int N = 305;
const int inf = 1e12;
const int mx = 1000;

vector<int> g[N];
bool locate[N][N];
int dis[N][N];
vector<vector<int>> recipe[N];
int dp[N][N];

int n, m, s, r;

//city i,stone j

int go(int i, int j)
{
    int &ans = dp[i][j];

    if (ans != -1)
        return ans;

    int res = inf;

    if (locate[i][j] == 1)
        return res = 0;

    f(l, n) if (l != i) res = min(res, go(l, j) + dis[l][i]);

    for (auto vv : recipe[j])
    {
        int temp = 0;

        for (auto v : vv)
        {
            int temp2 = inf;

            f(l, n) temp2 = min(temp2, go(l, v) + dis[i][l]);

            temp += temp2;
        }

        res = min(res, temp);
    }

    return ans = res;
}

void solve()
{
    cin >> n >> m >> s >> r;

    int u, v;

    while (m--)
    {
        cin >> u >> v;
        g[u].pb(v);
        g[v].pb(u);
    }

    //calculate distance

    f(i, n)
    {
        f(j, n) dis[i][j] = mx;

        vector<bool> vis(n, 0);

        vis[i] = 1;
        dis[i][i] = 0;

        queue<int> q;
        q.push(i);

        while (!q.empty())
        {
            auto x = q.front();
            q.pop();

            for (auto v : g[x])
                if (!vis[v])
                {
                    vis[v] = 1;
                    q.push(v);
                    dis[i][v] = dis[i][x] + 1;
                }
        }
    }

    f(i, n)
    {
        cin >> u;

        f(j, u)
        {
            cin >> v;
            locate[i][v] = 1;
        }
    }

    f(i, r)
    {
        vi go;

        cin >> u;

        f(j, u)
        {
            cin >> v;
            go.pb(v);
        }

        cin >> v;

        recipe[v].push_back(go);
    }

    f(i, n) f(j, s) dp[i][j] = -1;

    int res = inf;

    f(i, n) res = min(res, go(i, 1));

    if (res >= 1e12)
        res = -1;

    cout << res << '\n';

    for (int i = 0; i < N; i++)
    {
        g[i].clear();
        for (int j = 0; j < N; j++)
            locate[i][j] = 0;
        recipe[i].clear();
    }
}

signed main()
{
    fast;

    int t = 1;

    cin >> t;

    for (int i = 1; i <= t; i++)
    {
        cout << "Case #" << i << ": ";
        solve();
    }
}
