### BUGGY CODE ###

# from bisect import bisect_left as bl, bisect_right as br
# from collections import deque
N, M = map(int, input().split())
A = [0] * N
B = [0] * N
for i in range(N):
    a, b = map(int, input().split())
    A[i] = a
    B[i] = b

S = sorted(A)
D = {a: i for i, a in enumerate(S)}

BB = [0] * (N+1)
for i in range(N):
    BB[D[A[i]] + 1] = B[i]

for i in range(1, N+1):
    BB[i-1] ^= BB[i]

def bl(L, k):
    l, r = -1, len(L)
    while r - l > 1:
        m = (l+r) // 2
        if L[m] >= k:
            r = m
        else:
            l = m
    return r

A = [D[a] for a in A]
X = [[] for _ in range(N+1)]
DD = {}
for i in range(M):
    l, r = map(int, input().split())
    l = bl(S, l)
    r = bl(S, r+1)
    X[l].append(r)
    X[r].append(l)
    DD[(l<<18) + r] = i
    DD[(r<<18) + l] = i

# Q = deque([i for i in range(N+1)])
Q = [i for i in range(N+1)]
P = [-1] * (N+1)
CH = [[] for _ in range(N+1)]
R = []
done = [0] * (N+1)
while Q:
    # i = deque.pop(Q)
    i = Q.pop()
    if P[i] < 0: R.append(i)
    for j in X[i]:
        if P[j] >= 0: continue
        if j != P[i] and done[j] == 0:
            R.append(j)
            done[j] = 1
            P[j] = i
            CH[i].append(j)
            # X[j].remove(i)
            # deque.append(Q, j)
            Q.append(j)

ANS = []
for i in R[1:][::-1]:
    if BB[i]:
        BB[i] ^= 1
        BB[P[i]] ^= 1
        if P[i] < 0:
            print(-1)
            exit()
        ANS.append(DD[(i<<18) + P[i]] + 1)
if sum(BB) == 0:
    print(len(ANS))
    print(*sorted(ANS))
else:
    print(-1)

### FIXED CODE ###

import sys
input = sys.stdin.readline

# from bisect import bisect_left as bl, bisect_right as br
# from collections import deque
N, M = map(int, input().split())
A = [0] * N
B = [0] * N
for i in range(N):
    a, b = map(int, input().split())
    A[i] = a
    B[i] = b

S = sorted(A)
D = {a: i for i, a in enumerate(S)}

BB = [0] * (N+1)
for i in range(N):
    BB[D[A[i]] + 1] = B[i]

for i in range(1, N+1):
    BB[i-1] ^= BB[i]

def bl(L, k):
    l, r = -1, len(L)
    while r - l > 1:
        m = (l+r) // 2
        if L[m] >= k:
            r = m
        else:
            l = m
    return r

A = [D[a] for a in A]
X = [[] for _ in range(N+1)]
DD = {}
for i in range(M):
    l, r = map(int, input().split())
    l = bl(S, l)
    r = bl(S, r+1)
    X[l].append(r)
    X[r].append(l)
    DD[(l<<18) + r] = i
    DD[(r<<18) + l] = i

# Q = deque([i for i in range(N+1)])
# Q = [i for i in range(N+1)]
P = [-1] * (N+1)
CH = [[] for _ in range(N+1)]
R = []
done = [0] * (N+1)
for ii in range(N+1):
    Q = [ii]
    while Q:
        i = Q.pop()
        if P[i] < 0:
            R.append(i)
            done[i] = 1
        for j in X[i]:
            if P[j] >= 0: continue
            if j != P[i] and done[j] == 0:
                R.append(j)
                done[j] = 1
                P[j] = i
                CH[i].append(j)
                # X[j].remove(i)
                # deque.append(Q, j)
                Q.append(j)

ANS = []
for i in R[1:][::-1]:
    if BB[i]:
        BB[i] ^= 1
        BB[P[i]] ^= 1
        if P[i] < 0:
            print(-1)
            exit()
        ANS.append(DD[(i<<18) + P[i]] + 1)
if sum(BB) == 0:
    print(len(ANS))
    print(*sorted(ANS))
else:
    print(-1)