#pragma GCC optimize("Ofast,unroll-loops")
#include <bits/stdc++.h>
#define ms(x, y) memset(x, y, sizeof x)
#define sp ,' ',
#define el ,'\n'
using namespace std;
using ll = long long;
using ld = long double;
using pii = pair<int, int>;
using l2 = array<ll, 2>;
using l3 = array<ll, 3>;
template<typename... Args>
inline void out(Args... args) {
(cout << ... << args);
}
struct r {
template<typename T>
inline r& operator,(T& x) {
cin >> x;
return *this;
}
} in;
#define in in,
int n, m, q, pa[100005], val[100005], dph[100005], ans[100005];
vector<int> adj[100005];
vector<pii> dp[100005];
vector<tuple<int, vector<int>, int>> queries, queriesh;
void solve() {
ms(ans, -1);
in n, m, q;
while (m--) {
int u, v; in u, v;
adj[v].push_back(u);
}
for (int i = 0; i < q; i++) {
int t, y; in t, y;
vector<int> v(y);
for (auto &e: v) in e;
sort(v.begin(), v.end());
if (y >= 330) queriesh.push_back({t, v, i});
else queries.push_back({t, v, i});
}
sort(queries.begin(), queries.end(), [](auto &l, auto &r) {return get<0>(l) < get<0>(r);});
int i = 1;
for (auto &[t, v, idx]: queries) {
for (; i <= t; i++) {
vector<int> rem;
for (auto p: adj[i]) for (auto r: dp[p]) {
if (val[r.second] == 0) val[r.second] = r.first + 1, rem.push_back(r.second);
else if (r.first + 1 > val[r.second]) val[r.second] = r.first + 1;
}
dp[i].push_back({0, i});
for (auto r: rem) dp[i].push_back({val[r], r}), val[r] = 0;
rem.clear();
sort(dp[i].begin(), dp[i].end(), greater<>());
dp[i].resize(min(dp[i].size(), (size_t)330));
}
for (auto r: dp[t]) if (!binary_search(v.begin(), v.end(), r.second)) {ans[idx] = r.first; break;}
}
for (auto &[t, v, idx]: queriesh) {
ms(dph, 0);
for (auto e: v) dph[e] = INT_MIN;
for (int i = 1; i <= t; i++) for (auto p: adj[i]) if (dph[p] + 1 > dph[i]) dph[i] = dph[p] + 1;
ans[idx] = max(ans[idx], dph[t]);
}
for (int i = 0; i < q; i++) out(ans[i] el);
}
signed main() {
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int t = 1;
// in(t);
while (t--) solve();
}