#include <iostream>
#include <vector>
#include <queue>
using namespace std;
struct Mail {
int dist, cur;
bool operator<(const Mail &other) const {//largest dist at front, smallest at back
return dist < other.dist;
}
};
int main() {
int n, m;
cin >> n;
vector<int> adj(n+1);
for (int i = 1; i <= n; i++) cin >> adj[i];
cin >> m;
vector<priority_queue<Mail>> mails(n+1), new_mails(n+1);//mails at each node
vector<int> visited(n+1, -1);
for (int i = 0; i < m; i++) {
int from, dest;
cin >> from >> dest;
int dist = 0;
int u = from;
while (u != dest) {
visited[u] = i;
dist++;
u = adj[u];
if (visited[u] == i) {//impossible to deliver (use t to track the time using visited array)
cout << -1;
return 0;
}
}
if (dist != 0) mails[from].emplace(dist, from);
}
//delay schedule if multiple mail at same node
int comp = 0, time = 0;//completed mails
while (comp < m) {
for (int i = 1; i <= n; i++) {// i = node number
if (!mails[i].empty()) {
Mail mail = mails[i].top();
mails[i].pop();
//add to next node
mail.cur = adj[mail.cur];
mail.dist--;
if (mail.dist == 0) {
comp++;
} else {
new_mails[mail.cur].push(mail);
}
}
}
for (int i = 1; i <= n; i++) {
while (!new_mails[i].empty()) {
Mail mail = new_mails[i].top();
new_mails[i].pop();
mails[i].push(mail);
}
}
time++;
}
cout << time;
}