#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
const int LIM = 2000;
const double EPS = 1e-6;
struct line {
  long long a, b, c;
} l[N];
vector<pair<int, int> > sol;
double start;
inline bool haveIntersect(line l1, line l2) {
  return l1.a * l2.b - l1.b * l2.a != 0;
}
inline bool haveIntersect(line l1, line l2, line l3) {
  if (!haveIntersect(l1, l2)) return 0;
  if (!haveIntersect(l1, l3)) return 0;
  if (!haveIntersect(l2, l3)) return 0;
  double x12, y12, x23, y23;
  y12 =
      (double)(l2.c * l1.a - l1.c * l2.a) / (double)(l1.b * l2.a - l2.b * l1.a);
  y23 =
      (double)(l3.c * l2.a - l2.c * l3.a) / (double)(l2.b * l3.a - l3.b * l2.a);
  x12 =
      (double)(l2.c * l1.b - l1.c * l2.b) / (double)(l1.a * l2.b - l2.a * l1.b);
  x23 =
      (double)(l3.c * l2.b - l2.c * l3.b) / (double)(l2.a * l3.b - l3.a * l2.b);
  return abs(x12 - x23) < EPS && abs(y12 - y23) < EPS;
}
inline void solve(vector<int> v, int k) {
  if ((clock() - start) / CLOCKS_PER_SEC > 1.93) throw -1;
  if ((int)v.size() <= k) {
    for (int u : v) sol.push_back(pair<int, int>(u, -1));
    throw 0;
  }
  for (int i = 0; i <= k; i++)
    for (int j = i + 1; j <= k; j++)
      if (haveIntersect(l[v[i]], l[v[j]])) {
        sol.push_back(pair<int, int>(v[i], v[j]));
        vector<int> nv;
        for (int r = 0; r < (int)v.size(); r++)
          if (r != i && r != j && !haveIntersect(l[v[i]], l[v[j]], l[v[r]]))
            nv.push_back(v[r]);
        solve(nv, k - 1);
        sol.pop_back();
      }
}
int main() {
  start = clock();
  srand(N);
  int n, k;
  scanf("%d%d", &n, &k);
  for (int i = 1; i <= n; i++)
    scanf("%I64d%I64d%I64d", &l[i].a, &l[i].b, &l[i].c);
  vector<int> vec;
  if (n > LIM && k == 5) {
    int i1, i2;
    bool done = 0;
    for (int rep = 0; rep < 100; rep++) {
      i1 = i2 = 0;
      while (i1 == i2) {
        i1 = rand() % n + 1;
        i2 = rand() % n + 1;
      }
      if (!haveIntersect(l[i1], l[i2])) continue;
      int cnt = 2;
      for (int i = 1; i <= n; i++)
        if (i != i1 && i != i2 && haveIntersect(l[i1], l[i2], l[i])) ++cnt;
      if (cnt >= 6) {
        sol.push_back(pair<int, int>(i1, i2));
        for (int i = 1; i <= n; i++)
          if (i != i1 && i != i2 && !haveIntersect(l[i1], l[i2], l[i]))
            vec.push_back(i);
        --k;
        done = 1;
        break;
      }
    }
    if (!done) {
      printf("NO\n");
      return 0;
    }
  } else
    for (int i = 1; i <= n; i++) vec.push_back(i);
  try {
    solve(vec, k);
  } catch (int res) {
    if (res != -1) {
      printf("YES\n%d\n", (int)sol.size());
      for (pair<int, int> p : sol) printf("%d %d\n", p.first, p.second);
      return 0;
    }
  }
  printf("NO\n");
  return 0;
}
