#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++) {
// add current
for (int j : like[C[i]]) {
int r = (j - i) % M;
if (r < 0) r += M;
if (cnt[r] == 0) active++;
cnt[r]++;
}
// remove old
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;
}
}
// greedy covering
int ans = 0;
int i = 0;
while (i < N) {
int best = -1;
// try all possible starts that can cover i
for (int j = max(0, i - M + 1); j <= i && j + M <= N; j++) {
if (good[j]) {
best = max(best, j + M);
}
}
if (best == -1) return -1;
ans++;
i = best;
}
return ans;
}