#include <bits/stdc++.h>
using namespace std;
struct node {
  int a, b, c, id;
} st;
vector<node> lines;
vector<pair<int, int> > ans;
long long chk(node x, node y, node z) {
  return (long long)x.a * y.b * z.c + (long long)x.b * y.c * z.a +
         (long long)x.c * y.a * z.b;
}
void work(vector<node> L, int k) {
  int n = L.size();
  if (n <= k) {
    puts("YES");
    printf("%d\n", n + ans.size());
    for (int i = 0; i < n; i++) printf("%d %d\n", L[i].id, -1);
    for (int i = 0, _end = ans.size(); i < _end; i++)
      printf("%d %d\n", ans[i].first, ans[i].second);
    exit(0);
  }
  if (k == 0) return;
  vector<node> nowi;
  for (int i = 1, _end = k * k; i <= _end; i++) {
    int x = rand() % n, y = rand() % (n - 1);
    if (y == x) y++;
    if ((long long)L[x].a * L[y].b == (long long)L[x].b * L[y].a) continue;
    while (nowi.size()) nowi.pop_back();
    for (int j = 0; j < n; j++)
      if (chk(L[x], L[y], L[j]) != chk(L[x], L[j], L[y])) nowi.push_back(L[j]);
    if (nowi.size() > max((double)k - 1, n * (1 - 0.5 / k))) continue;
    ans.push_back(make_pair(L[x].id, L[y].id));
    work(nowi, k - 1);
    ans.pop_back();
  }
}
int n, k;
int main() {
  srand(306724);
  scanf("%d%d", &n, &k);
  for (int i = 1; i <= n; i++) {
    scanf("%d%d%d", &st.a, &st.b, &st.c);
    st.id = i;
    lines.push_back(st);
  }
  work(lines, k);
  puts("NO");
  return 0;
}
