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;
vector<int> adj[300003];
vector<int> adje[300003];
int d[300003];
int pickd[300003];
bool vis[300003];
int n, m;
int x;
int dfs1(int u) {
  int ans = 0;
  if (d[u] == -1)
    x = u;
  else if (d[u] == 1)
    ++ans;
  vis[u] = true;
  for (int v : adj[u]) {
    if (!vis[v]) {
      ans += dfs1(v);
    }
  }
  return ans;
}
int dfs2(int u) {
  int ans = 0;
  if (d[u] == 1) ++ans;
  vis[u] = true;
  for (int i = 0; i < ((int)(adj[u].size())); ++i) {
    int v = adj[u][i];
    if (!vis[v]) {
      int c = dfs2(v);
      if (c % 2) pickd[adje[u][i]] = 1;
      ans += c;
    }
  }
  return ans;
}
bool solve() {
  memset(vis, 0, sizeof(vis));
  for (int i = 1; i <= n; ++i) {
    if (!vis[i]) {
      x = -1;
      int c = dfs1(i);
      if (c % 2) {
        if (x == -1)
          return false;
        else {
          d[x] = 1;
        }
      }
    }
  }
  memset(vis, 0, sizeof(vis));
  memset(pickd, 0, sizeof(pickd));
  for (int i = 1; i <= n; ++i) {
    if (!vis[i]) {
      dfs2(i);
    }
  }
  int k = accumulate(pickd + 1, pickd + m + 1, 0);
  cout << k << "\n";
  for (int i = 1; i <= m; ++i) {
    if (pickd[i]) {
      cout << i << " \n"[(--k) == 0];
    }
  }
  return true;
}
int main() {
  ios ::sync_with_stdio(0);
  while (cin >> n >> m) {
    for (int i = 1; i <= n; ++i) {
      cin >> d[i];
    }
    for (int i = 1; i <= m; ++i) {
      int u, v;
      cin >> u >> v;
      adj[u].push_back(v);
      adj[v].push_back(u);
      adje[u].push_back(i);
      adje[v].push_back(i);
    }
    if (!solve()) cout << "-1\n";
    for (int i = 1; i <= n; ++i) {
      adj[i].clear();
      adje[i].clear();
    }
  }
  return 0;
}
