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;
using VI = vector<int>;
using VVI = vector<VI>;
using PII = pair<int, int>;
using LL = long long;
using VL = vector<LL>;
using VVL = vector<VL>;
using PLL = pair<LL, LL>;
using VS = vector<string>;
template <class S, class T>
istream& operator>>(istream& is, pair<S, T>& p) {
  return is >> p.first >> p.second;
}
template <class S, class T>
ostream& operator<<(ostream& os, const pair<S, T>& p) {
  return os << p.first << " " << p.second;
}
template <class T>
void maxi(T& x, T y) {
  if (x < y) x = y;
}
template <class T>
void mini(T& x, T y) {
  if (x > y) x = y;
}
const double EPS = 1e-10;
const double PI = acos(-1.0);
const LL MOD = 1e9 + 7;
int main() {
  cin.tie(0);
  ios_base::sync_with_stdio(false);
  int V, E;
  cin >> V >> E;
  VI rank(V);
  int ixn = -1;
  for (int i = (0); i < (V); ++i) {
    cin >> rank[i];
    if (rank[i] == -1) ixn = i;
  }
  vector<vector<PII>> G(V);
  for (int i = (0); i < (E); ++i) {
    int u, v;
    cin >> u >> v;
    --u;
    --v;
    G[u].emplace_back(v, i + 1);
    G[v].emplace_back(u, i + 1);
  }
  if (ixn >= 0) {
    vector<bool> vis(V);
    VI num(V);
    VI es;
    function<void(int, int, int)> dfs = [&](int u, int p, int ix) {
      vis[u] = true;
      for (auto& e : G[u]) {
        if (vis[e.first]) continue;
        dfs(e.first, u, e.second);
      }
      if (rank[u] != -1) {
        if (num[u] % 2 != rank[u]) {
          num[u]++;
          num[p]++;
          es.push_back(ix);
        }
      }
    };
    dfs(ixn, ixn, -1);
    sort(begin(((es))), end(((es))));
    cout << int((es).size()) << endl;
    for (int ix : es) cout << ix << endl;
    return 0;
  }
  if (accumulate(begin((rank)), end((rank)), 0) % 2 == 1) {
    cout << -1 << endl;
    return 0;
  }
  vector<bool> vis(V);
  VI num(V);
  VI es;
  function<void(int, int, int)> dfs = [&](int u, int p, int ix) {
    vis[u] = true;
    for (auto& e : G[u]) {
      if (vis[e.first]) continue;
      dfs(e.first, u, e.second);
    }
    if (num[u] % 2 != rank[u]) {
      num[u]++;
      num[p]++;
      es.push_back(ix);
    }
  };
  dfs(0, 0, -1);
  sort(begin(((es))), end(((es))));
  cout << int((es).size()) << endl;
  for (int ix : es) cout << ix << endl;
  return 0;
}
