#include <bits/stdc++.h>
using namespace std;
int minimumInstructions(
int N, int M, int K,
vector<int> C,
vector<int> A,
vector<vector<int>> B
) {
vector<vector<int>> like(K);
for (int j = 0; j < M; j++) {
for (int c : B[j]) {
like[c].push_back(j);
}
}
vector<int> cnt(M, 0);
int active = 0;
vector<int> good(N, 0);
for (int i = 0; i < N; i++) {
for (int j : like[C[i]]) {
int r = (j - i) % M;
if (r < 0) r += M;
if (cnt[r] == 0) active++;
cnt[r]++;
}
if (i >= M) {
for (int j : like[C[i - M]]) {
int r = (j - (i - M)) % M;
if (r < 0) r += M;
cnt[r]--;
if (cnt[r] == 0) active--;
}
}
if (i >= M - 1 && active == M) {
good[i - M + 1] = 1;
}
}
// DP with prefix minimum
const int INF = 1e9;
vector<int> dp(N + 1, INF);
dp[0] = 0;
// next reachable max
int r = 0;
for (int i = 0; i < N; i++) {
if (dp[i] == INF) continue;
while (r < N && good[r] && r <= i) {
r++;
}
for (int j = i; j < N && j <= i + M - 1; j++) {
if (good[j]) {
int to = j + M;
dp[to] = min(dp[to], dp[i] + 1);
}
}
}
return (dp[N] == INF ? -1 : dp[N]);
}