#include <bits/stdc++.h>
using namespace std;
vector<pair<int, int> > signs;
void win() {
  cout << "YES" << endl;
  cout << signs.size() << endl;
  for (auto sign : signs) cout << sign.first << " " << sign.second << endl;
  exit(0);
}
struct line {
  long long a;
  long long b;
  long long c;
  int name;
};
vector<line> leftover(0);
vector<int> Count(0);
int unsatisfied = 0;
void gameOver() {
  cout << "NO" << endl;
  exit(0);
}
struct point {
  long long x;
  long long y;
  long long d;
};
long long gcd(long long a, long long b) {
  if (a < 0) a *= -1;
  if (b < 0) b *= -1;
  long long tmp;
  while (b) {
    a %= b;
    tmp = a;
    a = b;
    b = tmp;
  }
  return a;
}
bool intersects(line l, line m) { return l.a * m.b != l.b * m.a; }
point getIntersection(line l, line m) {
  point P;
  P.d = l.a * m.b - l.b * m.a;
  P.x = l.b * m.c - l.c * m.b;
  P.y = l.c * m.a - l.a * m.c;
  if (P.d < 0) {
    P.d *= -1;
    P.x *= -1;
    P.y *= -1;
  }
  long long d = gcd(P.d, P.x);
  d = gcd(d, P.y);
  P.d /= d;
  P.x /= d;
  P.y /= d;
  return P;
}
bool lineContainsPoint(line l, point P) {
  return l.a * P.x + l.b * P.y + l.c * P.d == 0;
}
bool operator<(point P, point Q) {
  if (P.x != Q.x) return P.x < Q.x;
  if (P.y != Q.y) return P.y < Q.y;
  return P.d < Q.d;
}
vector<line> L;
bool bruteForced(int signsLeft) {
  if (signsLeft == 0) {
    for (int i : Count)
      if (i == 0) return false;
    return true;
  }
  if (unsatisfied <= signsLeft) {
    for (int i = 0; i < Count.size(); i++)
      if (Count[i] == 0) signs.push_back(pair<int, int>(leftover[i].name, -1));
    return true;
  }
  for (int i = 0; i < Count.size(); i++) {
    if (Count[i] > 0) continue;
    for (int j = i + 1; j < Count.size(); j++) {
      if (Count[j] > 0) continue;
      if (!intersects(leftover[i], leftover[j])) continue;
      point P = getIntersection(leftover[i], leftover[j]);
      vector<int> passesThroughP(0);
      for (int a = 0; a < leftover.size(); a++)
        if (lineContainsPoint(leftover[a], P)) passesThroughP.push_back(a);
      for (int a : passesThroughP) Count[a]++;
      if (bruteForced(signsLeft - 1)) {
        signs.push_back(pair<int, int>(leftover[i].name, leftover[j].name));
        return true;
      }
      for (int a : passesThroughP) Count[a]--;
    }
  }
  return false;
}
int main() {
  int n, k;
  cin >> n >> k;
  L = vector<line>(n + 1, line({0, 0, 0, 0}));
  for (int i = 1; i <= n; i++) {
    cin >> L[i].a >> L[i].b >> L[i].c;
    L[i].name = i;
  }
  vector<int> used(n + 1, 0);
  int blacklist = 0;
  for (int i = 1; i <= n; i++) {
    if (used[i]) continue;
    map<point, vector<int> > M;
    for (int j = i + 1; j <= n; j++) {
      if (!intersects(L[i], L[j])) continue;
      point P = getIntersection(L[i], L[j]);
      if (M.find(P) == M.end()) M[P] = vector<int>(0);
      M[P].push_back(j);
    }
    bool fail = true;
    for (auto const &entry : M) {
      if (entry.second.size() >= k) {
        fail = false;
        signs.push_back(pair<int, int>(i, entry.second[0]));
        used[i] = 1;
        for (int j : entry.second) used[j] = 1;
      }
    }
    if (fail) {
      blacklist++;
      if (blacklist > 20) gameOver();
    }
    if (signs.size() > k) gameOver();
  }
  int signsLeft = k - signs.size();
  for (int i = 1; i <= n; i++)
    if (!used[i]) leftover.push_back(L[i]);
  if (leftover.size() == 0) win();
  unsatisfied = leftover.size();
  Count = vector<int>(unsatisfied, 0);
  if (bruteForced(signsLeft)) win();
  cout << "NO" << endl;
}
