#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
const int oo = 2e9 + 1;
const int MOD = 1e9 + 7;
const int M = 1e4 + 5;
int cnt[4 * M], sum[4 * M];
void add(int pos, int val, int node = 0, int st = 1, int en = M - 1) {
  if (st == en) {
    cnt[node] += val;
    sum[node] += val * st;
    return;
  }
  int m = (st + en) >> 1;
  if (pos <= m)
    add(pos, val, 2 * node + 1, st, m);
  else
    add(pos, val, 2 * node + 2, m + 1, en);
  sum[node] = sum[2 * node + 1] + sum[2 * node + 2];
  cnt[node] = cnt[2 * node + 1] + cnt[2 * node + 2];
}
int GetFirstK(int k, int node = 0, int st = 1, int en = M - 1) {
  if (k == 0) return 0;
  if (st == en) {
    assert(k <= cnt[node]);
    return k * st;
  }
  int m = (st + en) >> 1;
  if (k < cnt[2 * node + 1])
    return GetFirstK(k, 2 * node + 1, st, m);
  else
    return sum[2 * node + 1] +
           GetFirstK(k - cnt[2 * node + 1], 2 * node + 2, m + 1, en);
}
void solve() {
  memset(cnt, 0, sizeof(cnt));
  memset(sum, 0, sizeof(sum));
  int n, m, k;
  cin >> n >> m >> k;
  vector<pair<int, int>> Alice, Bob, Both, FU;
  for (int i = 0; i < n; ++i) {
    int t, a, b;
    cin >> t >> a >> b;
    assert(t < M && t > 0);
    if (a && b) {
      Both.push_back({t, i + 1});
    } else if (a) {
      Alice.push_back({t, i + 1});
    } else if (b) {
      Bob.push_back({t, i + 1});
    } else {
      FU.push_back({t, i + 1});
    }
  }
  sort(Alice.begin(), Alice.end());
  sort(Bob.begin(), Bob.end());
  sort(Both.begin(), Both.end());
  sort(FU.begin(), FU.end());
  int both_take = -1, alice_take = 0, bob_take = 0, have = 0;
  while (alice_take < k && alice_take < (int)Alice.size()) {
    have += Alice[alice_take].first;
    ++alice_take;
  }
  while (bob_take < k && bob_take < (int)Bob.size()) {
    have += Bob[bob_take].first;
    ++bob_take;
  }
  for (int i = alice_take; i < (int)Alice.size(); ++i) {
    add(Alice[i].first, 1);
  }
  for (int i = bob_take; i < (int)Bob.size(); ++i) {
    add(Bob[i].first, 1);
  }
  for (auto it : Both) add(it.first, 1);
  for (auto it : FU) add(it.first, 1);
  int ans = 2e9 + 1;
  for (int b = 0; b <= (int)Both.size() && b <= k; ++b) {
    if (b > 0) {
      have += Both[b - 1].first;
      add(Both[b - 1].first, -1);
    }
    while (b + alice_take > k && alice_take > 0) {
      --alice_take;
      add(Alice[alice_take].first, 1);
      have -= Alice[alice_take].first;
    }
    while (b + bob_take > k && bob_take > 0) {
      --bob_take;
      add(Bob[bob_take].first, 1);
      have -= Bob[bob_take].first;
    }
    if (m >= alice_take + bob_take + b && alice_take + b >= k &&
        bob_take + b >= k) {
      int now = have + GetFirstK(m - alice_take - bob_take - b);
      assert(alice_take + b == k);
      assert(bob_take + b == k);
      if (ans > now) {
        ans = now;
        both_take = b;
      }
    }
  }
  if (both_take == -1) {
    cout << "-1\n";
    return;
  }
  alice_take = k - both_take;
  bob_take = k - both_take;
  vector<pair<int, int>> rest;
  vector<int> ord;
  int chk = 0;
  for (int i = 0; i < both_take; ++i) {
    ord.push_back(Both[i].second);
    chk += Both[i].first;
  }
  for (int i = 0; i < alice_take; ++i) {
    ord.push_back(Alice[i].second);
    chk += Alice[i].first;
  }
  for (int i = 0; i < bob_take; ++i) {
    ord.push_back(Bob[i].second);
    chk += Bob[i].first;
  }
  for (auto it : FU) rest.push_back(it);
  for (int i = both_take; i < (int)Both.size(); ++i) rest.push_back(Both[i]);
  for (int i = alice_take; i < (int)Alice.size(); ++i) rest.push_back(Alice[i]);
  for (int i = bob_take; i < (int)Bob.size(); ++i) rest.push_back(Bob[i]);
  sort(rest.begin(), rest.end());
  int need = m - alice_take - bob_take - both_take;
  for (int i = 0; i < need; ++i) {
    ord.push_back(rest[i].second);
    chk += rest[i].first;
  }
  cout << ans << '\n';
  assert(chk == ans);
  for (auto it : ord) cout << it << " ";
  cout << '\n';
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  ;
  int t = 1;
  while (t--) {
    solve();
  }
  return 0;
}
