#include <algorithm>
struct _data {
	int t;
	char a;
	char b;

	bool operator()(_data& A, _data& B)
	{
		int score_a = A.a << 1 | A.b;
		int score_b = B.a << 1 | B.b;

		if (score_a < score_b)
		{
			return false;
		}
		if (score_a > score_b)
		{
			return true;
		}

		if (A.t > B.t)
		{
			return false;
		}
		if (A.t < B.t)
		{
			return true;
		}
		return false;
	}
};
_data data[200000];
int main()
{
	int n, k;
	scanf("%d %d", &n, &k);

	int i;
	int cnt_a = 0, cnt_b = 0;
	for (i = 0; i < n; i++)
	{
		int a, b;
		scanf("%d %d %d", &data[i].t, &a, &b);
		data[i].a = a;
		data[i].b = b;

		if (a == 1) cnt_a++;
		if (b == 1) cnt_b++;
	}

	if (cnt_a < k || cnt_b < k)
	{
		printf("-1");
		return 0;
	}

	std::sort(data, data + n, _data());

	int sum_t = 0;
	cnt_a = cnt_b = 0;
	int i_d1, i_d2, i_d3, i_p1, i_p2;

	// [0 ~ i_d1 - 1]		: Alice & Bob
	// [i_d1 ~ i_d2 - 1]	: Alice
	// [i_d2 ~ i_d3 - 1]	: Bob
	// [i_d3 ~ n - 1]		: Nobody

	for (i_d1 = 0; data[i_d1].a == 1 && data[i_d1].b == 1 && i_d1 < n; i_d1++);
	for (i_d2 = i_d1; data[i_d2].a == 1 && data[i_d2].b == 0 && i_d2 < n; i_d2++);
	for (i_d3 = i_d2; data[i_d3].a == 0 && data[i_d3].b == 1 && i_d3 < n; i_d3++);

	i = 0;
	i_p1 = i_d1;
	i_p2 = i_d2;

	// Alice & Bob
	while (i < i_d1 && (cnt_a < k && cnt_b < k))
	{
		// Only Alice or Only Bob exists
		if ((i_d1 <= i_p1 && i_p1 < i_d2) && 
			(i_d2 <= i_p2 && i_p2 < i_d3))
		{
			if (data[i].t < data[i_p1].t + data[i_p2].t)
			{
				sum_t += data[i].t;
				cnt_a++;
				cnt_b++;
			}
			else
			{
				sum_t += (data[i_p1].t + data[i_p2].t);
				cnt_a++;
				i_p1++;
					
				cnt_b++;
				i_p2++;
			}
		}
		else
		{
			sum_t += data[i].t;
			cnt_a++;
			cnt_b++;
		}
		i++;
	}

	i = i_p1;
	// Only Alice
	while (i < i_d2 && (cnt_a < k))
	{
		sum_t += data[i].t;
		cnt_a++;
		i++;
	}

	i = i_p2;
	// Only Bob
	while (i < i_d3 && (cnt_b < k))
	{
		sum_t += data[i].t;
		cnt_b++;
		i++;
	}

	if (cnt_a >= k && cnt_b >= k)
	{
		printf("%d", sum_t);
	}
	else
		// Something's wrong
	{
		__asm nop;
	}
	return 0;
}