#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
typedef pair <int, int> pii;
typedef long double ld;
const int N = 2e3 + 3;
int n, m, k[N];
vector <int> to[N];
int in[N], o[N];
queue <int> q;
vector <int> ans;
void Tp_sort(void) {
int tim = 0;
for (int i = 1; i <= n; ++i) {
if (!in[i]) {
q.push(i);
}
}
while (!q.empty()) {
++tim;
for (int i = 0; i < q.size(); ++i) {
int u = q.front();
if (tim >= k[u]) {
q.pop();
ans.push_back(u);
for (int v : to[u]) {
--in[v];
if (!in[v]) q.push(v);
}
break;
}
q.pop();
q.push(u);
}
}
reverse(ans.begin(), ans.end());
for (int i : ans) cout << i << ' ';
cout << '\n';
return ;
}
void ex_Tp_sort(int s) {
for (int i = 1; i <= n; ++i) {
if (!in[i]) {
q.push(i);
}
}
int tim = 0;
while (!q.empty()) {
++tim;
vector <int> vec;
for (int i = 0; i < q.size(); ++i) {
vec.push_back(q.front());
q.push(q.front());
q.pop();
}
auto it = find(vec.begin(), vec.end(), s);
if (it == vec.end()) {
for (int i = 0; i < q.size(); ++i) {
int u = q.front();
if (tim >= k[u]) {
q.pop();
for (int v : to[u]) {
--in[v];
if (!in[v]) q.push(v);
}
break;
}
q.pop();
q.push(u);
}
}
else {
bool flag = false;
int idx = 0;
for (int i = 0; i < q.size(); ++i) {
int u = q.front();
if (u == s) {
q.pop();
q.push(u);
continue;
}
if (tim < k[u]) continue;
flag = true;
idx = u;
break;
}
if (!flag) {
cout << n - tim + 1 << ' ';
break;
}
for (int i = 0; i < q.size(); ++i) {
int u = q.front();
if (u != idx) {
q.pop();
q.push(u);
continue;
}
q.pop();
for (int v : to[u]) {
--in[v];
if (!in[v]) q.push(v);
}
break;
}
}
}
return ;
}
int main(void) {
cin.tie(0), cout.tie(0);
cin >> n >> m;
for (int i = 1; i <= n; ++i) {
cin >> k[i];
k[i] = n - k[i] + 1;
}
for (int i = 1, a, b; i <= m; ++i) {
cin >> a >> b;
to[b].push_back(a);
++in[a];
}
memcpy(o, in, sizeof in);
Tp_sort();
for (int i = 1; i <= n; ++i) {
memcpy(in, o, sizeof o);
while (!q.empty()) q.pop();
ex_Tp_sort(i);
}
return 0;
}