#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<ll, ll>;
#define all(x) (x).begin(), (x).end()
#define sz(x) (int)(x).size()
#define fi first
#define se second
#define pb push_back
#define eb emplace_back
int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};
template<class X, class Y> bool maximize (X &x, const Y &y) {return x < y ? x = y, 1 : 0;}
template<class X, class Y> bool minimize (X &x, const Y &y) {return x > y ? x = y, 1 : 0;}
const int maxn = 1e5 + 5;
const int MOD = 1e9 + 7;
const int INF = 0x3f3f3f3f;
const int B = 200;
int n, m, q;
vector<int> radj[maxn];
vector<pair<int, int>> paths[maxn];
int idk[maxn];
int main()
{
ios::sync_with_stdio(false); cin.tie(0);
//freopen(".INP", "r", stdin);
//freopen(".OUT", "w", stdout);
cin >> n >> m >> q;
for (int i = 1; i <= m; ++i) {
int u, v; cin >> u >> v;
radj[v].pb(u);
}
memset(idk, -1, sizeof idk);
for (int i = 1; i <= n; ++i) {
paths[i].pb({0, i});
vector<int> adj;
for (auto j : radj[i]) {
for (auto k : paths[j]) {
if (idk[k.se] == -1) {
adj.pb(k.se);
idk[k.se] = k.fi + 1;
}
else idk[k.se] = max(idk[k.se], k.fi + 1);
}
}
for (auto j : adj) paths[i].pb({idk[j], j}), idk[j] = -1;
sort(paths[i].rbegin(), paths[i].rend());
while (sz(paths[i]) > B) paths[i].pop_back();
}
vector<int> blocked(n+1, 0);
while (q--) {
int t, y; cin >> t >> y;
vector<int> temp;
for (int i = 0; i < y; ++i) {
int x; cin >> x;
blocked[x] = 1, temp.pb(x);
}
if (y >= B) {
vector<int> dist(n+1, -1);
dist[t] = 0;
for (int i = t; i >= 1; --i) {
for (auto v : radj[i]) {
dist[v] = max(dist[v], dist[i] + 1);
}
}
int ans = -1;
for (int i = 1; i <= t; ++i) if (!blocked[i]) ans = max(ans, dist[i]);
cout << ans << '\n';
}
else {
bool flag = 0;
for (auto i : paths[t]) {
if (!blocked[i.se]) {
cout << i.fi << '\n';
flag = 1;
break;
}
}
if (!flag) cout << -1 << '\n';
}
for (auto i : temp) blocked[i] = 0;
}
return 0;
}