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];
void dfs(int v) {
  vis[v] = 1;
  if (d[v] == 1) return;
  for (int id : g[v]) {
    int to = go(id, v);
    if (!vis[to]) {
      used[id] = 1;
      dfs(to);
    }
  }
}
int grau[N];
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];
    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);
    g[a].push_back(i);
    g[b].push_back(i);
  }
  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++) {
    used[i] = 1;
    grau[e[i].a]++;
    grau[e[i].b]++;
  }
  for (int i = 1; i <= m; i++) {
    int a1 = grau[e[i].a];
    int a2 = grau[e[i].b];
    if (((a1 % 2) != (d[e[i].a])) and ((a2 % 2) != (d[e[i].b]))) {
      used[i] = 0;
      grau[e[i].a]--;
      grau[e[i].b]--;
    }
  }
  for (int i = 1; i <= n; i++) {
    if ((grau[i] % 2) != d[i]) {
      cout << i << " " << grau[i] << "\n";
      cout << -1 << "\n";
      return 0;
    }
  }
  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";
}
