#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 1e5 + 5;
struct edge
{
int e;
edge *n;
edge(int e = 0, edge *n = NULL) : e(e), n(n) {}
} *pre[N];
void insert1(int s, int e)
{
edge *tmp(new edge(e, pre[s]));
pre[s] = tmp;
}
int n, m, fin[N], ans[N], ind[N], outd[N];
ll f[N];
priority_queue<int, vector<int>, greater<int>> q;
int main()
{
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++)
{
scanf("%lld", f + i);
}
for (int i = 1, x, y; i <= m; i++)
{
scanf("%d%d", &x, &y);
insert1(x, y);
outd[x]++;
ind[y]++;
}
for (int i = 1; i <= n; i++)
{
if (!outd[i])
fin[++fin[0]] = i;
if (!ind[i])
q.push(i);
}
while (!q.empty())
{
int u(q.top());
q.pop();
ans[++ans[0]] = u;
for (edge *i = pre[u]; i; i = i->n)
{
int e = i->e;
f[e] += f[u];
ind[e]--;
if (!ind[e])
q.push(e);
}
}
for (int i = 1; i <= n; i++)
{
printf("%ld ", ans[i]);
}
printf("\n");
for (int i = 1; i <= fin[0]; i++)
{
printf("%lld ", f[fin[i]]);
}
printf("\n");
}