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 lehagraph
{
	static int v[], n, m;
	static ArrayList<Edge> adj[];
	public static void main(String[] args)
	{
		FastScanner in = new FastScanner();
		n = in.nextInt();
		m = in.nextInt();
		v = new int[n];
		adj = new ArrayList[n];
		int sum = 0, extra = 0;
		
		for(int i = 0; i < n; i++)
		{
			v[i] = in.nextInt();
			adj[i] = new ArrayList<>();
			
			if(v[i] > 0) sum++;
			if(v[i] < 0) extra++;
		}
		
		if(extra > 0)
		{
			int val = sum % 2;
			sum += sum % 2;
			extra = 0;
			for(int i = 0; i < n; i++)
			{
				if(v[i] == -1)
				{
					v[i] = val;
					val = 0;
				}
			}
		}
		
		if(sum % 2 == 1)
		{
			System.out.println(-1);
			return;
		}
		
		for(int i = 0; i < m; i++)
		{
			int v1 = in.nextInt()-1;
			int v2 = in.nextInt()-1;
			
			adj[v1].add(new Edge(v2, i+1));
			adj[v2].add(new Edge(v1, i+1));
		}
		
		adj = root(0, adj);
		go(0);
		
		int cnt = 0;
		TreeSet<Integer> set = new TreeSet<>();
		for(int i = 0; i < n; i++)
		{
			for(Edge e : adj[i])
			{
				if(e.used)
				{
					cnt++;
					set.add(e.idx);
				}
			}
		}
		
		System.out.println(cnt);
		for(Integer i : set)
			System.out.println(i);
	}
	
	private static boolean go(int i)
	{
		if(adj[i].size() == 0)
			return v[i] != 0;
		
		for(Edge e : adj[i])
		{
			e.used = go(e.v2);
			if(e.used)
				v[i] ^= 1;
		}
		
		return v[i] != 0;
	}

	private static ArrayList<Edge>[] root(int root, ArrayList<Edge>[] adj)
	{
		ArrayList<Edge> rev[] = new ArrayList[n];
		ArrayDeque<Integer> q = new ArrayDeque<>();
		boolean visited[] = new boolean[n];
		q.offer(root);
		visited[root] = true;
		for(int i = 0; i < n; i++)
			rev[i] = new ArrayList<>();
		
		while(!q.isEmpty())
		{
			int u = q.poll();
			
			for(Edge e : adj[u])
			{
				if(visited[e.v2]) continue;
				visited[e.v2] = true;
				rev[u].add(e);
				q.add(e.v2);
			}
		}
		
		return rev;
	}

	public static class Edge
	{
		int v2, idx;
		boolean used;
		
		public Edge(int vv, int i)
		{
			v2 = vv;
			idx = i;
			used = false;
		}
	}
	
	public static class FastScanner
	{
		BufferedReader br;
		StringTokenizer st;

		public FastScanner(String s)
		{
			try {
				br = new BufferedReader(new FileReader(s));
			} catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

		public FastScanner()
		{
			br = new BufferedReader(new InputStreamReader(System.in));
		}

		String nextToken()
		{
			while (st == null || !st.hasMoreElements())
			{
				try {
					st = new StringTokenizer(br.readLine());
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			return st.nextToken();
		}

		int nextInt()
		{
			return Integer.parseInt(nextToken());
		}

		long nextLong()
		{
			return Long.parseLong(nextToken());
		}

		double nextDouble()
		{
			return Double.parseDouble(nextToken());
		}
		
		String next()
		{
			return nextToken();
		}
	}
}
