#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);
// find valid starts
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;
}
}
// nxt[i] = farthest we can reach starting from i
vector<int> nxt(N, -1);
int best = -1;
for (int i = 0; i < N; i++) {
if (good[i]) best = max(best, i + M);
nxt[i] = best;
}
// greedy jump (like minimum intervals cover)
int ans = 0;
int i = 0;
while (i < N) {
if (nxt[i] <= i) return -1;
int far = nxt[i];
// extend using all starts inside [i, far)
int new_far = far;
for (int j = i; j < far; j++) {
new_far = max(new_far, nxt[j]);
}
ans++;
i = new_far;
}
return ans;
}