input = raw_input
range = xrange
import sys
inp = [int(x) for x in sys.stdin.read().split()]; ii = 0

seg = [0]*200000

def offset(x):
	return x + 100000
def encode(x, y):
	return (x<<18) + y

def upd(node, L, R, pos, val):
	while L < R:
		seg[node] += val
		seg[offset(node)] += val*pos
		if L+1 == R:
			break

		M = (L+R)//2
		node <<= 1
		if pos < M:
			R = M
		else:
			L = M
			node += 1

def query(node, L, R, k):
	if k == 0:
		return 0, 0
	if seg[node] < k:
		return seg[offset(node)], seg[node]
	if L+1 == R:
		return [L*k, k]
	M = (L+R)>>1
	leftval, leftct = query(node<<1, L, M, k)
	rightval, rightct = query(node<<1 | 1, M, R, k-leftct)
	return leftval+rightval, leftct+rightct

n, m, k = inp[ii:ii+3]; ii += 3
A, B, AB, notAB = [], [], [], []
for i in range(n):
	t, a, b = inp[ii:ii+3]; ii += 3
	if a == 0 and b == 0:
		notAB.append(encode(t, i+1))
	if a == 1 and b == 0:
		A.append(encode(t, i+1))
	if a == 0 and b == 1:
		B.append(encode(t, i+1))
	if a == 1 and b == 1:
		AB.append(encode(t, i+1))
	upd(1, 0, 10001, t, 1)

A.sort(); B.sort(); AB.sort()
p1 = min(k, len(AB))
p2 = k - p1
if 2*k - p1 > m or p2 > min(len(A), len(B)):
	print(-1)
	exit(0)

sum, ans, ch = 0, 2**31, p1
for i in range(p1):
	sum += AB[i]>>18
	upd(1, 0, 10001, AB[i]>>18, -1)
for i in range(p2):
	sum += (A[i]>>18) + (B[i]>>18)
	upd(1, 0, 10001, A[i]>>18, -1)
	upd(1, 0, 10001, B[i]>>18, -1)


ans, _ = query(1, 0, 10001, m-2*k+p1)
ans += sum

while p1 > 0:
	if p2 == min(len(A), len(B)):
		break
	upd(1, 0, 10001, A[p2]>>18, -1); sum += A[p2]>>18
	upd(1, 0, 10001, B[p2]>>18, -1); sum += B[p2]>>18
	upd(1, 0, 10001, AB[p1-1]>>18, 1); sum -= AB[p1-1]>>18
	p2 += 1
	p1 -= 1
	if m - 2*k + p1 < 0:
		break
	Q, _ = query(1, 0, 10001, m-2*k+p1)
	if ans > sum + Q:
		ans = sum + Q
		ch = p1

print ans
mask = (1<<18)-1
ind = [AB[i]&mask for i in range(ch)] + [A[i]&mask for i in range(k-ch)] + [B[i]&mask for i in range(k-ch)]
st = sorted(notAB + AB[ch:] + A[k-ch:] + B[k-ch:])
ind += [st[i]&mask for i in range(m-2*k+ch)]
print ' '.join(str(x) for x in ind)