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;
const long long MOD = 1e9 + 7;
const long long N = 3e5 + 5;
const long long INF = 1e14;
bool vis[N];
vector<long long> adj[N], edge[N];
vector<long long> ans;
long long d[N];
long long dfs(long long u) {
  long long ret = 0;
  if (d[u] == 1) ret = 1;
  vis[u] = true;
  for (long long i = 0; i < adj[u].size(); i++) {
    long long v = adj[u][i];
    if (vis[v]) continue;
    long long x = dfs(v);
    ret = (ret + x);
    if (x % 2 == 1) ans.push_back(edge[u][i]);
  }
  return ret;
}
int main() {
  ios::sync_with_stdio(false);
  long long n, m;
  cin >> n >> m;
  for (long long i = 0; i < n; i++) {
    vis[i] = false;
    cin >> d[i];
  }
  for (long long i = 0; i < m; i++) {
    long long a, b;
    cin >> a >> b;
    a--;
    b--;
    adj[a].push_back(b);
    adj[b].push_back(a);
    edge[a].push_back(i + 1);
    edge[b].push_back(i + 1);
  }
  bool th = false;
  int tot = 0;
  long long pq;
  for (long long i = 0; i < n; i++) {
    if (d[i] == -1) {
      th = true;
      pq = i;
    }
    if (d[i] == 1) tot = (tot + 1) % 2;
  }
  if (!th && tot % 2) {
    cout << "-1\n";
    return 0;
  } else if (tot % 2) {
    d[pq] = 1;
  }
  if (dfs(0) % 2) {
    cout << "-1\n";
    return 0;
  }
  cout << ans.size() << "\n";
  for (long long i = 0; i < ans.size(); i++) cout << ans[i] << " ";
  if (ans.size() != 0) cout << "\n";
  return 0;
}
