//关键路径的模板题,首先按照拓扑排序的顺序去计算每个点最早的开始时间,在拓扑排序的过程中将节点保存进栈里面
//然后从栈里面挨个的取出,每取出一个去找他的出度边,去计算最晚开始时间。
//最后遍历一遍所有的点,如果最早开始时间和最晚开始时间相等那么就是关键事件。
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 3e5+10;
const int maxnn = 1e5+10;
struct sy{
int to;
int next;
int w;
}edge[maxn];
struct Node{
int first;
int late = 0x3f3f;
int cost;
} node[maxnn];
int head[maxnn];
map<int, int> mp;
int cnt = 0;
int n, m, rt;
//记录入度的个数
int in[maxnn];
stack<int> st;
//构造链式前向星
void add_edge(int u, int v, int w)
{
edge[++cnt].next = head[u];
edge[cnt].to = v;
edge[cnt].w = w;
head[u] = cnt;
}
//开始进行第一步拓扑排序
bool tuopu()
{
queue<int> q;
int num = 0;
for (int i=1;i<=n;i++)
{
if (in[i]==0)
{
q.push(i);
mp[i] = 1;
}
}
while (q.size())
{
int pos = q.front();
q.pop();
num ++;
st.push(pos);
rt = max(rt, node[pos].first+node[pos].cost);
for (int i=head[pos];i;i = edge[i].next)
{
int next = edge[i].to;
int w = edge[i].w;
node[next].first = max(node[next].first, node[pos].first+w);
in[next]--;
if (in[next]==0) q.push(next);
}
}
if(num!=n) return false;
return true;
}
void fanxiang()
{
while (st.size())
{
int pos = st.top();
// cout<<"pos="<<pos<<endl;
st.pop();
node[pos].late = rt-node[pos].cost;
for (int i=head[pos];i;i = edge[i].next)
{
int next = edge[i].to;
int late = node[next].late;
int w = edge[i].w;
node[pos].late = min(node[pos].late, late-w);
}
}
}
signed main()
{
int t, u, v;
cin>>n>>m;
for (int i=1;i<=n;i++) cin>>node[i].cost;
for (int i=1;i<=m;i++)
{
cin>>u>>v;
in[v]++;
add_edge(u,v,node[u].cost);
}
bool isok = tuopu();
if (!isok)
{
cout<<-1;
return 0;
}
// cout<<"rt="<<rt<<endl;
fanxiang();
vector<int> vt;
for (int i=1;i<=n;i++)
{
// cout<<node[i].first<<" "<<node[i].late<<endl;
if (node[i].late > node[i].first)
{
vt.push_back(i);
}
}
cout<<vt.size()<<endl;
vector<int>::iterator it = vt.begin();
for (it;it!=vt.end();it++)
{
cout<<(*it)<<' ';
}
return 0;
}