#include <bits/stdc++.h>
using namespace std;

/*-------------------Define Start-------------------*/
typedef bool BL;    					// 布尔类型
typedef char SB;    					// 有符号1字节,8位
typedef unsigned char UB;    			// 无符号1字节,8位
typedef short SW;    					// 有符号短整型,16位
typedef unsigned short UW;    			// 无符号短整型,16位
typedef long SDW;    					// 有符号整型,32位
typedef unsigned long UDW;   			// 无符号整型,32位
typedef long long SLL;    				// 有符号长整型,64位
typedef unsigned long long ULL;			// 无符号长整型,64位
typedef char CH;    					// 单个字符
typedef float R32;    					// 单精度浮点数
typedef double R64;    					// 双精度浮点数

#define Rep(i, n) for (register SDW i = 0; i < (n); ++i)
#define For(i, s, t) for (register SDW i = (s); i <= (t); ++i)
#define rFor(i, t, s) for (register SDW i = (t); i >= (s); --i)
#define foreach(i, c) for (__typeof(c.begin()) i = c.begin(); i != c.end(); ++i)
#define ms0(a) memset(a,0,sizeof(a))
#define msI(a) memset(a,0x7f,sizeof(a))
#define LOWBIT(x) ((x)&(-x))

#define MP make_pair
#define PB push_back
#define ft first
#define sd second
#define ALL(x) x.begin(),x.end()

#define pr(x) cout << #x << " = " << x << "  "
#define prln(x) cout << #x << " = " << x << endl

const ULL mod = 1e9 + 7;				//常用模数(可根据题目需要修改)
const ULL inf = 0x7fffffff;				//用来表示无限大
const ULL infLL = 0x7fffffffffffffffLL;	//用来表示无限大

// 重载<<操作符，用来打印vector 
template < typename T >
ostream& operator<< (ostream& out, vector< T > vec) {
	foreach(i, vec) {
		if(i != vec.begin()) {
			out << " ";
		}
		out << *i;
	}
    return out;
}
/*-------------------Define End-------------------*/

const UDW maxN = 1e5 + 7;

struct Bomb{
	SDW pos; // 炸弹的坐标 
	BL st; // 激活状态 
	
	Bomb() {}
	Bomb(SDW pos, BL st) : pos(pos), st(st) {}
	
	BL operator< (const Bomb &x) const {
		return pos < x.pos;
	}
};

struct Vertex{
	vector< SDW > next;
}; 

struct Edge{
	SDW id, from, to;
	
	Edge(SDW id, SDW from, SDW to) : id(id), from(from), to(to) {}
};

SDW N, M; 
Bomb bomb[maxN];
vector< Edge > E;
Vertex V[maxN];
BL vis[maxN];
SDW k;
vector< SDW > c;

void addEdge(Edge x) {
    V[x.from].next.PB(E.size());
    E.PB(x);
}

void input(){
	cin >> N >> M;
	Rep(i, N) {
		cin >> bomb[i].pos >> bomb[i].st;
	}
	sort(bomb, bomb + N); // 把炸弹按坐标排序，设bomb[N]为假想的炸弹 
	
	Rep(i, M) {
		SDW L, R;
		cin >> L >> R;
		// 把坐标覆盖区域[L, R]转化为炸弹下标覆盖区域[u, v)，如此一来顶点有V[0]~V[N]一共N+1个 
		SDW u = lower_bound(bomb, bomb + N, Bomb(L, false)) - bomb; 	// u为覆盖区域[L, R]中离L最近的炸弹在bomb数组中的位置 
		SDW v = upper_bound(bomb, bomb + N, Bomb(R, false)) - bomb; 	// v为覆盖区域[L, R]中离R最近的炸弹在bomb数组中的位置的后一个位置 
		if(u != v) {
			addEdge(Edge(i << 1, u, v));
			addEdge(Edge(i << 1 | 1, v, u));
		}
	}
}

BL dfs(SDW x) {
	vis[x] = true;
	
	foreach(i, V[x].next) {
		Edge e = E[*i];
		
		// 如果dfs(e.to)为真，则代表边e需要被选一次 
		if(!vis[e.to] && dfs(e.to)) {
			c.PB((e.id >> 1) + 1);
			++k;
			// 当边e被选时，以下两个值会发生变化 
			bomb[x].st ^= 1;
			bomb[e.to].st ^= 1; // 可以不要这条语句，但是写上，便于理解 
		}
	}
	
	return bomb[x].st;
}

void solve(){
	rFor(i, N, 1) {
		bomb[i].st ^= bomb[i - 1].st;
	} 
	
	For(i, 0, N) {
		if(!vis[i] && dfs(i)) {
			k = -1;
			break;
		}
	}
}

void output(){
	cout << k << endl;
	if(k != -1) {
		sort(ALL(c));
		cout << c << endl;
	}
}

int main() {
	input();
	solve();
	output();
	return 0;
}


Measured memory_bytes: 26664