#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 10;
struct node {
  int x, y;
  friend bool operator<(node a, node b) { return a.x > b.x; }
};
struct Node {
  int x, y;
  friend bool operator<(Node a, Node b) { return a.x < b.x; }
};
priority_queue<node> que[2][2];
priority_queue<Node> Que[2][2];
int main() {
  int n, m, k;
  scanf("%d%d%d", &n, &m, &k);
  for (int i = 1; i <= n; i++) {
    int a, b, c;
    scanf("%d%d%d", &a, &b, &c);
    que[b][c].push(node{a, i});
  }
  if (min(que[0][1].size(), que[1][0].size()) + que[1][1].size() < k) {
    puts("-1");
    return 0;
  }
  if (que[1][1].size() < k &&
      (k - que[1][1].size()) * 2 > m - que[1][1].size()) {
    puts("-1");
    return 0;
  }
  int ans = 0, cnt = 0, cot = 0;
  while (cnt < k && !que[1][1].empty() && !que[1][0].empty() &&
         !que[0][1].empty()) {
    node a = que[1][1].top(), b = que[1][0].top(), c = que[0][1].top();
    if (m - cot == k - cnt || a.x < b.x + c.x) {
      cnt++, cot++;
      que[1][1].pop();
      Que[1][1].push(Node{a.x, a.y});
    } else {
      cnt++, cot += 2;
      que[1][0].pop(), que[0][1].pop();
      Que[1][0].push(Node{b.x, b.y}), Que[0][1].push(Node{c.x, c.y});
    }
  }
  while (cnt < k && !que[1][1].empty()) {
    node a = que[1][1].top();
    Que[1][1].push(Node{a.x, a.y});
    que[1][1].pop();
    cnt++, cot++;
  }
  while (cnt < k && !que[1][0].empty() && !que[0][1].empty()) {
    node b = que[1][0].top(), c = que[0][1].top();
    cnt++, cot += 2, que[1][0].pop(), que[0][1].pop();
    Que[1][0].push(Node{b.x, b.y}), Que[0][1].push(Node{c.x, c.y});
  }
  while (cnt == k && cot < m) {
    int a = 0, b = 0, mi = 20000;
    for (int i = 0; i < 2; i++) {
      for (int j = 0; j < 2; j++)
        if (!que[i][j].empty()) {
          node c = que[i][j].top();
          if (c.x < mi) {
            mi = c.x;
            a = i, b = j;
          }
        }
    }
    Que[a][b].push(Node{mi, que[a][b].top().y}), que[a][b].pop();
    if (a == 0 && a == 1 && !Que[1][1].empty() && !que[1][0].empty() &&
        que[1][0].top().x < Que[1][1].top().x) {
      que[1][1].push(node{Que[1][1].top().x, Que[1][1].top().y}),
          Que[1][1].pop();
      Que[1][0].push(Node{que[1][0].top().x, que[1][0].top().y}),
          que[1][0].pop();
    }
    if (a == 1 && b == 0 && !Que[1][1].empty() && !que[0][1].empty() &&
        que[0][1].top().x < Que[1][1].top().x) {
      que[1][1].push(node{Que[1][1].top().x, Que[1][1].top().y}),
          Que[1][1].pop();
      Que[0][1].push(Node{que[0][1].top().x, que[0][1].top().y}),
          que[0][1].pop();
    }
    cot++;
  }
  vector<int> arr;
  for (int i = 0; i < 2; i++)
    for (int j = 0; j < 2; j++) {
      while (!Que[i][j].empty()) {
        ans += Que[i][j].top().x;
        arr.push_back(Que[i][j].top().y);
        Que[i][j].pop();
      }
    }
  printf("%d\n", ans);
  for (auto x : arr) printf("%d ", x);
  puts("");
  return 0;
}
