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;
inline long long mod(long long n, long long m) {
  long long ret = n % m;
  if (ret < 0) ret += m;
  return ret;
}
long long gcd(long long a, long long b) {
  return (b == 0LL ? a : gcd(b, a % b));
}
long long exp(long long a, long long b, long long m) {
  if (b == 0LL) return 1LL;
  if (b == 1LL) return mod(a, m);
  long long k = mod(exp(a, b / 2, m), m);
  if (b & 1LL) {
    return mod(a * mod(k * k, m), m);
  } else
    return mod(k * k, m);
}
const int N = 300100;
struct edge {
  int a, b;
  edge() {}
  edge(int u, int v) { a = u, b = v; }
} e[N];
vector<int> g[N];
int vis[N], used[N];
int go(int id, int i) { return e[id].a ^ e[id].b ^ i; }
int d[N];
int pai[N], grau[N];
int f(int x) { return pai[x] = (pai[x] == x ? x : f(pai[x])); }
void join(int a, int b) { pai[f(a)] = f(b); }
int32_t main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  ;
  int n, m;
  cin >> n >> m;
  int tot = 0;
  int neg = 0;
  for (int i = 1; i <= n; i++) {
    cin >> d[i];
    pai[i] = i;
    if (d[i] == -1)
      neg++;
    else
      tot += d[i];
  }
  for (int i = 1; i <= m; i++) {
    int a, b;
    cin >> a >> b;
    e[i] = edge(a, b);
  }
  if ((tot & 1) == 1 and neg == 0) {
    cout << -1 << "\n";
    return 0;
  }
  if (tot & 1) {
    for (int i = 1; i <= n; i++) {
      if (d[i] == -1) {
        if (neg) {
          d[i] = 1;
          neg = 0;
        } else
          d[i] = 0;
      }
    }
  } else
    for (int i = 1; i <= n; i++)
      if (d[i] == -1) d[i] = 0;
  for (int i = 1; i <= m; i++) {
    if (f(e[i].a) != f(e[i].b)) {
      g[e[i].a].push_back(i);
      g[e[i].b].push_back(i);
      grau[e[i].a]++;
      grau[e[i].b]++;
      join(e[i].a, e[i].b);
    }
  }
  queue<int> q;
  for (int i = 1; i <= n; i++) {
    if (grau[i] <= 1) q.push(i);
  }
  while (!q.empty()) {
    int cur = q.front();
    q.pop();
    grau[cur] = -1;
    for (auto id : g[cur]) {
      int to = go(id, cur);
      if (grau[to] <= 0) continue;
      grau[to]--;
      if (grau[to] <= 1) q.push(to);
      if (d[cur] == 1) {
        d[cur] = 1;
        d[to] ^= 1;
        used[id] = 1;
      }
    }
  }
  vector<int> res;
  for (int i = 1; i <= m; i++) {
    if (used[i]) res.push_back(i);
  }
  cout << (int)res.size() << "\n";
  for (int x : res) cout << x << " ";
  cout << "\n";
}
