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

import java.io.*;
import java.util.*;

public class Solution{
	InputStream is;
	static PrintWriter out;
	String INPUT = "";
	static long mod = (long)1e9+7L;
	
	ArrayList<Integer> al[], adj[];
	boolean vis[];
	int[] d;
	int n, m;
	public void solve(){
		n = ni(); m = ni();
		adj = new ArrayList[n];
		al = new ArrayList[n];
		for(int i = 0; i < n; i++){
			adj[i] = new ArrayList<Integer>();
			al[i] = new ArrayList<Integer>();
		}
		d = na(n);
		if(!okd(d)){
			out.println("-1");
			return;
		}
		Pair[] a = new Pair[m];
		for(int i = 0; i < m; i++){
			int x = ni()-1, y = ni()-1;
			adj[x].add(y);
			adj[y].add(x);
			if(x <= y){
				a[i] = new Pair(x, y);
			}
			else{
				a[i] = new Pair(y, x);
			}
		}

		vis = new boolean[n];
		dfs(0);
//out.println(Arrays.toString(al));
		Arrays.fill(vis, false);
		for(int i = 0; i < n; i++){
			adj[i].clear();
		}
		ans = new TreeSet<Pair>();
		dfs1(0, -1);
		for(int i = 0; i < n; i++){
			al[i].clear();
		}
		out.println(ans.size());
		TreeSet<Pair> set = new TreeSet<Pair>();
		for(int i = 0; i < m; i++){
			if(!set.contains(a[i])){
				if(ans.contains(a[i]) || ans.contains(new Pair(a[i].sc, a[i].fs))){
					System.out.println(i+1);
					set.add(a[i]);
				}
			}
		}
	}
	void dfs(int u){
		vis[u] = true;
		for(Integer v : adj[u]){
			if(!vis[v]){
				al[v].add(u);
				al[u].add(v);
				dfs(v);
			}
		}
		adj[u].clear();
	}
	TreeSet<Pair> ans;
	void dfs1(int u, int p){
		//out.println(u+" "+p);
		vis[u] = true;
		int ct = 0;
		for(Integer v : al[u]){
			if(!vis[v]){
				dfs1(v, u);
			}
		}

		if(p == -1)
			return;

		if(d[u] == 1){
			ans.add(new Pair(u, p));
			d[p] = (d[p]+1)%2;
		}
		adj[u].clear();
	}
	boolean okd(int[] d){
		int neg = 0, sum = 0;
		for(int i = 0; i < d.length; i++){
			if(d[i] == -1){
				neg += 1;
			}
			else{
				sum = (sum+d[i])%2;
			}
		}

		if(sum == 0){
			for(int i = 0; i < d.length; i++){
				if(d[i] == -1){
					d[i] = 0;
				}
			}
			return true;
		}
		else if(sum == 1 && neg == 0){
			return false;
		}
		else{
			boolean done = false;
			for(int i = 0; i < d.length; i++){
				if(d[i] == -1 && !done){
					d[i] = 1;
					done = true;
				}
				else if(d[i] == -1){
					d[i] = 0;
				}
			}
			return true;
		}
	}
	

	void run(){
		is = new DataInputStream(System.in);
		out = new PrintWriter(System.out);
		int t=1;while(t-->0)solve();
		out.flush();
	}
	public static void main(String[] args)throws Exception{new Solution().run();}
	long mod(long v, long m){if(v<0){long q=(Math.abs(v)+m-1L)/m;v=v+q*m;}return v%m;}
    long mod(long v){if(v<0){long q=(Math.abs(v)+mod-1L)/mod;v=v+q*mod;}return v%mod;}
	//Fast I/O code is copied from uwi code.
	private byte[] inbuf = new byte[1024];
	public int lenbuf = 0, ptrbuf = 0;
	private int readByte(){
		if(lenbuf == -1)throw new InputMismatchException();
		if(ptrbuf >= lenbuf){
			ptrbuf = 0;
			try { lenbuf = is.read(inbuf); } catch (IOException e) { throw new InputMismatchException(); }
			if(lenbuf <= 0)return -1;
		}
		return inbuf[ptrbuf++];
	}
	private boolean isSpaceChar(int c) { return !(c >= 33 && c <= 126); }
	private int skip() { int b; while((b = readByte()) != -1 && isSpaceChar(b)); return b; }
	private double nd() { return Double.parseDouble(ns()); }
	private char nc() { return (char)skip(); }
	private String ns(){
		int b = skip();
		StringBuilder sb = new StringBuilder();
		while(!(isSpaceChar(b))){ // when nextLine, (isSpaceChar(b) && b != ' ')
			sb.appendCodePoint(b);
			b = readByte();
		}
		return sb.toString();
	}
	private char[] ns(int n){
		char[] buf = new char[n];
		int b = skip(), p = 0;
		while(p < n && !(isSpaceChar(b))){
			buf[p++] = (char)b;
			b = readByte();
		}
		return n == p ? buf : Arrays.copyOf(buf, p);
	}
	private char[][] nm(int n, int m){
		char[][] map = new char[n][];
		for(int i = 0;i < n;i++)map[i] = ns(m);
		return map;
	}
	private int[] na(int n){
		int[] a = new int[n];
		for(int i = 0;i < n;i++)a[i] = ni();
		return a;
	}
	private int ni(){
		int num = 0, b;
		boolean minus = false;
		while((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-'));
		if(b == '-'){
			minus = true;
			b = readByte();
		}
		while(true){
			if(b >= '0' && b <= '9'){
				num = num * 10 + (b - '0');
			}else{
				return minus ? -num : num;
			}
			b = readByte();
		}
	}
	private long nl(){
		long num = 0;
		int b;
		boolean minus = false;
		while((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-'));
		if(b == '-'){
			minus = true;
			b = readByte();
		}		
		while(true){
			if(b >= '0' && b <= '9'){
				num = num * 10 + (b - '0');
			}else{
				return minus ? -num : num;
			}
			b = readByte();
		}
	}
	static  int i(long x){return (int)Math.round(x);}
	static class Pair implements Comparable<Pair>{
		long fs,sc;
		Pair(long a,long b){
			fs=a;sc=b;
		}
		public int compareTo(Pair p){
			if(this.fs>p.fs)return 1;
			else if(this.fs<p.fs)return -1;
			else{
				return i(this.sc-p.sc);
			}
			//return i(this.sc-p.sc);
		}
		public String toString(){
			return "("+fs+","+sc+")";
		}	
	}
	
}