#include <bits/stdc++.h>
using namespace std;
vector<vector<int>> g, rg;
vector<set<pair<int, int>>> path;
vector<int> dp, mark;
int n, m, q;
int main() {
cin.tie(0)->sync_with_stdio(0);
cin >> n >> m >> q;
g.assign(n+2, vector<int>());
rg.assign(n+2, vector<int>());
path.assign(n+2, set<pair<int, int>>());
mark.assign(n+2, 0);
while(m--) {
int u, v;
cin >> u >> v;
if(u > v) swap(u, v);
g[u].push_back(v);
rg[v].push_back(u);
}
for(int i=1; i<=n; i++) {
path[i].insert({0, i});
map<int, int> fr;
fr[i] = 0;
for(auto j: rg[i]) {
for(auto k: path[j]) {
if(fr.find(k.second) == fr.end()) {
path[i].insert({k.first+1, k.second});
fr[k.second] = k.first+1;
} else if(fr[k.second] < k.first+1) {
path[i].erase({fr[k.second], k.second});
path[i].insert({k.first+1, k.second});
fr[k.second] = k.first+1;
}
}
}
while(path[i].size() > 100) {
path[i].erase(path[i].begin());
}
}
while(q--) {
int t, y;
set<int> blk;
cin >> t >> y;
for(int i=1; i<=y; i++) {
int in;
cin >> in;
mark[in] = 1;
blk.insert(in);
}
if(y >= 100) {
dp.assign(n+2, -1);
for(int i=1; i<=t; i++) {
if(mark[i] == 0) dp[i] = max(dp[i], 0);
if(dp[i] == -1) continue;
for(auto j: g[i]) {
dp[j] = max(dp[j], dp[i]+1);
}
}
cout << dp[t] << "\n";
} else {
set<pair<int, int>> s = path[t];
while(!s.empty()) {
auto x = *s.rbegin();
if(blk.find(x.second) == blk.end()) {
cout << x.first << "\n";
break;
}
if(s.size() > 1) s.erase(prev(s.end()));
else s.erase(s.begin());
}
if(s.empty()) {
cout << "-1\n";
}
}
for(auto i: blk) mark[i] = 0;
}
}