#include<bits/stdc++.h>
using namespace std;
int n,m,head[100100],cnt,dsu[100100],pos[100100];
bool sta[100100],vis[100100];
pair<int,bool>p[100100];
struct edge{
	int to,next,id;
}edge[1001000];
void ae(int u,int v,int w){
	edge[cnt].id=w,edge[cnt].next=head[u],edge[cnt].to=v,head[u]=cnt++;
	edge[cnt].id=w,edge[cnt].next=head[v],edge[cnt].to=u,head[v]=cnt++;
}
vector<int>v;
int fd(int x){return dsu[x]==x?x:dsu[x]=fd(dsu[x]);}
bool mg(int x,int y){
	x=fd(x),y=fd(y);
	if(x==y)return false;
	dsu[x]=y;
	return true;
}
bool dfs(int x){
	bool res=sta[x];
	vis[x]=true;
	for(int i=head[x];i!=-1;i=edge[i].next){
		if(vis[edge[i].to])continue;
		bool now=dfs(edge[i].to);
		if(now)v.push_back(edge[i].id);
		res^=now;
	}
	return res;
}
int main(){
	scanf("%d%d",&n,&m),memset(head,-1,sizeof(head));
	for(int i=1;i<=n+1;i++)dsu[i]=i;
	for(int i=1;i<=n;i++)scanf("%d%d",&p[i].first,&p[i].second);
	sort(p+1,p+n+1);
	for(int i=1;i<=n;i++)pos[i]=p[i].first,sta[i]=p[i].second;
	for(int i=n;i;i--)sta[i]^=sta[i-1];
	for(int i=1,l,r;i<=m;i++){
		scanf("%d%d",&l,&r),l=lower_bound(pos+1,pos+n+1,l)-pos,r=upper_bound(pos+1,pos+n+1,r)-pos;
		if(mg(l,r))ae(l,r,i);
	}
	dfs(n+1);
	for(int i=1;i<=n;i++){
		if(vis[i])continue;
		if(dfs(i)){puts("-1");return 0;}
	}
	sort(v.begin(),v.end());
	printf("%d\n",v.size());
	for(int i=0;i<v.size();i++)printf("%d ",v[i]);
	return 0;
}