#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;

ll N, M;

struct bomb{
	int x;
	int sw;
};


struct Node {
	int node_id;
	int child1_node_id;
	int child2_node_id;
	int cord_id;
};

int node_count = 0;
vector<Node> nodes;

int new_node( int cord_id ){
	nodes.push_back({ node_count, -1, -1, cord_id });
	return node_count++;
}

int new_node( int child1_node_id, int child2_node_id ){
	nodes.push_back({ node_count, child1_node_id, child2_node_id, -1 });
	return node_count++;
}

void dump_node( int node_id ){
	const Node &n = nodes[node_id];
	cout << "[";
	if ( n.child1_node_id != -1 ) dump_node( n.child1_node_id );
	if ( n.child2_node_id != -1 ) dump_node( n.child2_node_id );
	if ( n.cord_id != -1 ) cout << n.cord_id;
	cout << "] ";
}




struct cord{
	int l, r; // [l,r)のスイッチを反転する
	int node_id;
};
vector<cord> c;

class Comp {
public:
	bool operator() ( int ll, int rr ){
		const cord& l = c[ll];
		const cord& r = c[rr];
		return l.l > r.l || (l.l==r.l && l.r > r.r);
	};
};

void dump(int i){
	cout << "dump " << i << " [" << c[i].l << ", " << c[i].r << ")" << endl;
	dump_node( c[i].node_id );
	cout << endl;
	cout << endl;
}

int main(){
	cin >> N >> M;
	
	vector<bomb> b(N);
	vector<int> x(N); // 座標圧縮用
	for ( int i = 0; i < N; i++ ){
		cin >> b[i].x >> b[i].sw;
		x[i] = b[i].x;
	}
	sort(b.begin(),b.end(),[](const bomb &l, const bomb &r){return l.x<r.x;});
	sort(x.begin(),x.end());
	for ( int i = 0; i < N; i++ ){
		b[i].x = i;
		//cout << i << " " << b[i].sw << endl;
	}
	c.resize(M);
	
	for ( int i = 0; i < M; i++ ){
		int l, r;
		cin >> l >> r;
		c[i].l = lower_bound(x.begin(),x.end(),l) - x.begin();
		c[i].r = lower_bound(x.begin(),x.end(),r+1) - x.begin();
		c[i].node_id = new_node(i);
	}
	
	
	
	// 同じlを持つコード同士をxorして、lがユニークになるようにする
	vector<int> cr;
	{
		priority_queue<int,vector<int>,Comp> q;
		for ( int i = 0; i < M; i++ ){
			if ( c[i].l != c[i].r ){
				q.push(i);
			}
		}
		
		vector<int> tmp;
		while ( !q.empty() ){
			
			// 同じlを持つcordをいったん取り出す
			while ( !q.empty() && (tmp.empty() || c[q.top()].l == c[tmp[0]].l ) ){
				tmp.push_back(q.top());
				q.pop();
			}
			
			// c[tmp[j]] ^= c[tmp[j-1]] を行う
			for ( size_t j = tmp.size()-1; j >= 1; j-- ){
				int tj = tmp[j];
				int tk = tmp[j-1];
				c[tj].l = c[tk].r;
				c[tj].node_id = new_node( c[tj].node_id, c[tk].node_id );
				if ( c[tj].l != c[tj].r )
					q.push(tj);
			}
			cr.push_back(tmp[0]);
			tmp.resize(0);
		}
	}
	
	
	//cout << "---cr:" << endl;
	//for ( size_t i = 0; i < cr.size(); i++ )
	//	dump(cr[i]);
	
	// 全てのBをOFFにする組み合わせを求める
	vector<int> combs;
	{
		priority_queue<int,vector<int>,greater<int>> qsw;
		int sw = 0;
		size_t cri = 0;
		for ( int i = 0; i < N; i++ ){
			while ( !qsw.empty() && qsw.top() <= i ){
				qsw.pop();
				sw ^= 1;
			}
			
			if ( b[i].sw != sw ){
				// cr から b[i]を反転できるスイッチを探す
				while ( cri < cr.size() && c[cr[cri]].l < i )
					cri++;
				if ( cri == cr.size() ){
					cout << -1 << endl;
					return 0;
				}
				int cord_id = cr[cri];
				
				if ( c[cord_id].l != i ){
					cout << -1 << endl;
					return 0;
				}
				
				combs.push_back(cord_id);
				qsw.push(c[cord_id].r);
				sw ^= 1;
			}
		}
		
	}
	
	//cout << "---combs:" << endl;
	//for ( auto it : combs )
	//	dump(it);
	
	// 組み合わせをコードのON/OFFに直す
	vector<int> sw(M);
	{
		priority_queue<int> q;
		
		for ( auto it : combs ){
			q.push(c[it].node_id);
		}
		
		while ( !q.empty() ){
			int node_id = q.top();
			q.pop();
			
			if ( !q.empty() && q.top() == node_id ){
				q.pop(); // 同じnode_idを2回使用するなら対消滅
			}
			else {
				Node &n = nodes[node_id];
				if ( n.cord_id != -1 )
					sw[n.cord_id] ^= 1;
				else {
					q.push(n.child1_node_id);
					q.push(n.child2_node_id);
				}
			}
		}
		
	}
	
	int count = 0;
	for ( int i = 0; i < M; i++ )
		if ( sw[i] )
			count++;
	cout << count << endl;
	
	for ( int i = 0; i < M; i++ )
		if ( sw[i] )
			cout << i+1 << " ";
	cout << endl;
	
	return 0;
}



Measured memory_bytes: 39652