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;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const int N = 1e6, inf = 1e9, mod = 1000000007;
vector<pair<int, int> > ad[N + 2], tree[N + 2];
int vis[N + 2], lev[N + 2];
void dfs(int node, int par, int lv) {
  vis[node] = 1, lev[node] = lv;
  for (auto x : ad[node]) {
    if (x.first == par) continue;
    if (vis[x.first]) {
    } else {
      tree[node].push_back(x);
      tree[x.first].push_back({node, x.second});
      dfs(x.first, node, lv + 1);
    }
  }
}
int a[N + 2], cnt[N + 2];
void dds(int nd, int pr, int id) {
  for (auto x : tree[nd]) {
    if (x.first == pr) continue;
    dds(x.first, nd, x.second);
  }
  if (pr == -1) return;
  if (a[nd] == 1) {
    cnt[id] ^= 1;
    a[nd] = 0;
    if (a[pr] != -1) a[pr] ^= 1;
  }
}
int f;
int vs[N + 2];
void dfs(int nd) {
  if (a[nd] == 1) {
    a[nd] = 0;
    f = 1;
    return;
  } else if (a[nd] == -1) {
    f = 1;
    return;
  }
  vs[nd] = 1;
  for (int i = 0; i < (int)tree[nd].size(); i++) {
    if (vs[tree[nd][i].first]) continue;
    cnt[tree[nd][i].second] ^= 1;
    dfs(tree[nd][i].first);
    if (f) break;
    cnt[tree[nd][i].second] ^= 1;
  }
  vs[nd] = 0;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  int n, m;
  cin >> n >> m;
  for (int i = 1; i <= n; i++) cin >> a[i];
  for (int i = 1; i <= m; i++) {
    int u, v;
    cin >> u >> v;
    ad[u].push_back({v, i});
    ad[v].push_back({u, i});
  }
  dfs(1, -1, 0);
  dds(1, -1, 0);
  int ans = 0;
  f = 1;
  if (a[1] == 1) {
    f = 0;
    a[1] = 0;
    dfs(1);
  }
  if (f == 0) cout << -1 << endl, exit(0);
  for (int i = 1; i <= m; i++) ans += cnt[i];
  cout << ans << endl;
  for (int i = 1; i <= m; i++)
    if (cnt[i]) cout << i << " ";
  cout << endl;
  return 0;
}
