#include <bits/stdc++.h>
#define io ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define ll long long
#define pii pair<int, int>
#define pb push_back
#define fi first
#define se second
using namespace std;

const int M = 250005;
const int N = 505;
const ll INFLL = 1e18+7;

struct edges
{
    int u, v, w;
} edge[M];

struct songoku
{
    int cost, u, pos;
};

int n, m, q;
int lab[N];
pii trace[N];
vector<songoku> g[N];
ll d[N];
bool mark[M];

ll calc(queue<pii> q)
{
    while (!q.empty())
    {
        int u=q.front().se, kc=q.front().fi; q.pop();
        if (kc>=u) continue;

        for (songoku x : g[u])
        {
            if (d[x.u]>d[u]+x.cost)
            {
                d[x.u]=d[u]+x.cost;
                trace[x.u]={u, x.pos};
                q.push({d[x.u], x.u});
            }
        }
    }

    memset(mark, 0, sizeof(mark));
    ll res=0;
    for (int i=1; i<=n; i++)
    {
        int u=i;
        while (trace[u].fi!=0)
        {
            if (mark[trace[u].se]==0) res+=edge[trace[u].se].w;
            mark[trace[u].se]=1;
            u=trace[u].fi;
        }
    }

    return res;
}

void solve()
{
    cin >> n >> m >> q;
    for (int i=1; i<=m; i++)
    {
        int u, v, w;
        cin >> u >> v >> w;
        edge[i]={u, v, w};
        g[u].pb({w, v, i});
        g[v].pb({w, u, i});
    }

    while (q--)
    {
        int k;
        cin >> k;

        for (int i=1; i<=n; i++) d[i]=INFLL;
        memset(trace, 0, sizeof(trace));
        queue<pii> q;
        for (int i=1; i<=k; i++)
        {
            int x;
            cin >> x;
            q.push({0, x});
            d[x]=0;
        }

        cout << calc(q);
    }
}

signed main()
{
    io
    freopen("giaohang.inp","r",stdin);
    freopen("giaohang.out","w",stdout);

    solve();
}