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;
const int INF = (int)(1e9 + 1337);
const long long LINF = (long long)(4e18);
const double EPS = (double)(1e-11);
struct edge {
  int ix;
  int to;
  edge() {}
  edge(int ix, int to) : ix(ix), to(to) {}
};
int n, m;
vector<vector<edge> > g;
int d[300010];
int ans[300010];
int u[300010];
const int ROOT = 1;
int dfs(int v) {
  u[v] = 1;
  int res = 0;
  if (d[v] == 1) {
    res = 1;
  }
  for (int i = 0; i < (int)g[v].size(); i++) {
    int to = g[v][i].to;
    if (u[to]) continue;
    int tres = dfs(to);
    if (tres) ans[g[v][i].ix] ^= 1;
    res ^= tres;
  }
  return res;
}
void solve() {
  cin >> n >> m;
  g.resize(n + 1);
  int ctr = 0;
  int lst = -1;
  for (int i = 1; i <= n; i++) {
    cin >> d[i];
    if (d[i] == 1)
      ctr++;
    else if (d[i] == -1) {
      d[i] = 0;
      lst = i;
    }
  }
  if (ctr & 1) {
    if (lst == -1) {
      cout << "-1";
      return;
    } else {
      d[lst] = 1;
    }
  }
  for (int i = 1; i <= m; i++) {
    int a, b;
    cin >> a >> b;
    if (d[a] && d[b]) {
      ans[i] ^= 1;
      d[a] = 0;
      d[b] = 0;
    }
    g[a].push_back(edge(i, b));
    g[b].push_back(edge(i, a));
  }
  dfs(1);
  ctr = 0;
  for (int i = 1; i <= m; i++) {
    ctr += ans[i];
  }
  cout << ctr << '\n';
  for (int i = 1; i <= m; i++)
    if (ans[i]) cout << i << '\n';
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  solve();
}
