#include #include #include #include #include using namespace std; const int N=1e5+5,M=2e5+5; int n,m; int read() { int x=0,f=1;char c=getchar(); while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} return x*f; } struct Node1{int a,b;}bomb[N]; struct Node2{int l,r,id;}cord[M]; struct Node3{int nxt,to,id;}Edges[M*2]; int num[N],cnt=0,w[N],head[N],tot=0; bool vis[N],legal=true; vectorc; int getw(int x){return lower_bound(num+1,num+1+cnt,x)-num;} void addedge(int u,int v,int id) { Edges[++tot].nxt=head[u]; head[u]=tot; Edges[tot].id=id,Edges[tot].to=v; } void dfs(int u,int f,int fEdge) { vis[u]=1; for(int i=head[u];~i;i=Edges[i].nxt) { int v=Edges[i].to; if(!vis[v])dfs(v,u,Edges[i].id); } if(w[u]==1) { if(!f){legal=0;return;} w[u]^=1,w[f]^=1,c.push_back(fEdge); } } int main() { memset(head,-1,sizeof(head)); n=read(),m=read(); for(int i=1;i<=n;i++) { bomb[i].a=read(),bomb[i].b=read(); num[++cnt]=bomb[i].a; } sort(num+1,num+1+cnt); cnt=unique(num+1,num+1+cnt)-num-1; for(int i=1;i<=n;i++)w[getw(bomb[i].a)]=bomb[i].b; for(int i=cnt+1;i;i--)w[i]^=w[i-1]; for(int i=1;i<=m;i++) { cord[i].l=read(),cord[i].r=read(),cord[i].id=i; int x=getw(cord[i].l),y=getw(cord[i].r+1); addedge(x,y,i),addedge(y,x,i); } for(int i=1;i<=cnt+1;i++) { if(!vis[i])dfs(i,0,0); if(!legal)break; } if(!legal)puts("-1"); else { printf("%d\n",c.size()); sort(c.begin(),c.end()); for(int i=0;i