#include <bits/stdc++.h>
using namespace std;
int N, M;
int d[300005];
bool alive[300005];
map<pair<int, int>, int> mp;
int par[300005];
vector<vector<pair<int, int>>> G;
int ufind(int x) { return par[x] < 0 ? x : par[x] = ufind(par[x]); }
bool dfs(int v, int pre) {
  for (auto e : G[v]) {
    if (e.first == pre) continue;
    if (dfs(e.first, v)) {
      alive[e.second] = false;
      if (d[v] >= 0) d[v] ^= 0x1;
    }
  }
  return (d[v] == 1);
}
int main() {
  int x, y;
  scanf("%d %d", &N, &M);
  G.resize(N + 2);
  for (int i = 1; i <= N; i++) scanf("%d", &d[i]);
  for (int i = 1; i <= M; i++) {
    alive[i] = true;
    scanf("%d %d", &x, &y);
    if (x > y) swap(x, y);
    if (d[x] >= 0) d[x] ^= 0x1;
    if (d[y] >= 0) d[y] ^= 0x1;
    mp[{x, y}] = i;
  }
  for (int i = 1; i <= N; i++) par[i] = -1;
  for (auto e2 : mp) {
    auto e = e2.first;
    if (ufind(e.first) == ufind(e.second)) continue;
    G[e.first].push_back({e.second, mp[e]});
    G[e.second].push_back({e.first, mp[e]});
    par[ufind(e.first)] = ufind(e.second);
  }
  int idx = 1;
  for (int i = 1; i <= N; i++) {
    if (d[i] == -1) {
      idx = i;
      break;
    }
  }
  dfs(idx, -1);
  if (d[idx] == 1)
    printf("-1\n");
  else {
    int cnt = 0;
    for (int i = 1; i <= M; i++) {
      if (alive[i] == true) cnt++;
    }
    printf("%d\n", cnt);
    for (int i = 1; i <= M; i++) {
      if (alive[i] == true) printf("%d\n", i);
    }
  }
  return 0;
}
