3 2
1 0 1
1 2
2 3
 10 10
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1
6 7
8 3
6 4
4 2
9 2
5 10
9 8
10 7
5 1
6 2

2
1
2
 0

#include <bits/stdc++.h>
using namespace std;
template <class T>
inline bool ckmin(T &x, const T &y) {
  return y < x ? x = y, 1 : 0;
}
template <class T>
inline bool ckmax(T &x, const T &y) {
  return x < y ? x = y, 1 : 0;
}
template <class T>
inline void readi(T &x) {
  char c;
  bool fl;
  while (c = getchar(), c != '-' && (c < '0' || c > '9'))
    ;
  if (c == '-')
    fl = 1, x = 0;
  else
    fl = 0, x = c - '0';
  while (c = getchar(), c >= '0' && c <= '9') x = x * 10 + c - '0';
  if (fl) x = -x;
}
const int MAXN = 333333;
int dsu_par[MAXN];
void dsu_init() {
  for (int i = 0; i < MAXN; i++) dsu_par[i] = i;
}
int dsu_find(int v) {
  if (v == dsu_par[v]) return v;
  return dsu_par[v] = dsu_find(dsu_par[v]);
}
void dsu_merge(int u, int v) {
  u = dsu_find(u), v = dsu_find(v);
  if (u != v) dsu_par[v] = u;
}
int n, m;
int d[MAXN], used[MAXN], val[MAXN], pre[MAXN];
vector<int> adj[MAXN];
map<pair<int, int>, int> edg;
vector<pair<int, int> > edg_list;
vector<int> res;
int dfs(int cur, int par = -1) {
  val[cur] = pre[cur];
  for (int v : adj[cur]) {
    if (v == par) continue;
    val[cur] += dfs(v, cur);
  }
  return val[cur];
}
void dfs2(int cur, int par = -1) {
  if (val[cur]) res.push_back(edg[{cur, par}]);
  for (int v : adj[cur]) {
    if (v == par) continue;
    dfs2(v, cur);
  }
}
int main() {
  readi(n), readi(m);
  int cnt1 = 0, cntn1 = 0;
  for (int i = 1; i <= n; i++) {
    readi(d[i]);
    if (d[i] == 1) cnt1++;
    if (d[i] == -1) cntn1++;
  }
  if ((cnt1 & 1) && (!cntn1)) {
    cout << -1 << endl;
    return 0;
  }
  for (int i = 1; i <= m; i++) {
    int u, v;
    readi(u), readi(v);
    edg[{u, v}] = edg[{v, u}] = i;
    edg_list.push_back(pair<int, int>(u, v));
  }
  dsu_init();
  for (int i = 0; i < (int)edg_list.size(); i++) {
    pair<int, int> e = edg_list[i];
    if (dsu_find(e.first) != dsu_find(e.second)) {
      used[i] = 1;
      dsu_merge(e.first, e.second);
      adj[e.first].push_back(e.second);
      adj[e.second].push_back(e.first);
    }
  }
  for (int i = 1; i <= n; i++) {
    if (d[i] == 1) pre[i] = 1;
    if ((cnt1 & 1) && (d[i] == -1)) pre[i] = 1, cnt1++;
  }
  dfs(1);
  for (int i = 1; i <= n; i++) val[i] &= 1;
  dfs2(1);
  sort(res.begin(), res.end());
  cout << res.size() << endl;
  for (int asdf : res) cout << asdf << ' ';
  cout << endl;
  return 0;
}
