#include <bits/stdc++.h>
using namespace std;
template <class T>
void debug(T a, T b) {
  ;
}
template <class T>
void chmin(T& a, const T& b) {
  if (a > b) a = b;
}
template <class T>
void chmax(T& a, const T& b) {
  if (a < b) a = b;
}
namespace std {
template <class S, class T>
ostream& operator<<(ostream& out, const pair<S, T>& a) {
  out << '(' << a.first << ',' << a.second << ')';
  return out;
}
}  // namespace std
long long int readL() {
  long long int res;
  scanf("%I64d", &res);
  return res;
}
void printL(long long int res) { printf("%I64d", res); }
int n, k;
struct line {
  long long int a, b, c;
};
line L[100005];
bool mark[100005];
vector<pair<int, int> > res;
bool cross(const line& x, const line& y, const line& z) {
  if (z.a * (-x.c * y.b + y.c * x.b) + z.b * (-x.a * y.c + x.c * y.a) ==
      -z.c * (x.a * y.b - x.b * y.a))
    return true;
  return false;
}
bool rec(int k) {
  int n2 = 0;
  for (int i = 0; i < (n); ++i)
    if (!mark[i]) ++n2;
  if (n2 <= k) {
    for (int i = 0; i < (n); ++i)
      if (!mark[i]) res.push_back(make_pair(i, -2));
    return true;
  }
  if (k == 0) return false;
  vector<pair<line, int> > cand;
  for (int i = 0; i < n && cand.size() < k + 1; ++i)
    if (!mark[i]) {
      cand.push_back(make_pair(L[i], i));
    }
  for (int i = 0; i < (cand.size()); ++i)
    for (int j = 0; j < (i); ++j) {
      line A = cand[i].first, B = cand[j].first;
      if (A.a * B.b - A.b * B.a == 0) continue;
      bool fail = false;
      for (int k = 0; k < (i); ++k)
        if (j != k && cross(A, B, cand[k].first)) fail = 1;
      if (fail) continue;
      vector<bool> ever(n);
      for (int k = 0; k < (n); ++k) ever[k] = mark[k];
      for (int k = 0; k < (n); ++k)
        if (!mark[k] && cross(A, B, L[k])) mark[k] = 1;
      res.push_back(make_pair(cand[i].second, cand[j].second));
      if (rec(k - 1)) return true;
      res.pop_back();
      for (int k = 0; k < (n); ++k) mark[k] = ever[k];
    }
  return false;
}
int main() {
  cin >> n >> k;
  for (int i = 0; i < (n); ++i) {
    int a, b, c;
    scanf("%d%d%d", &a, &b, &c);
    L[i] = (line){a, b, c};
  }
  int n2 = n;
  if (n2 >= 10000) {
    bool suc = false;
    for (int hoge = 0; hoge < (100); ++hoge) {
      int a = rand() % n, b = rand() % n;
      line A = L[a], B = L[b];
      if (A.a * B.b - A.b * B.a == 0) continue;
      int cnt = 0;
      for (int i = 0; i < (n); ++i)
        if (cross(A, B, L[i])) ++cnt;
      if (cnt >= k + 1) {
        suc = true;
        res.push_back(make_pair(a, b));
        for (int i = 0; i < (n); ++i)
          if (cross(A, B, L[i])) {
            mark[i] = 1;
            --n2;
          }
        --k;
        goto exi;
      }
    }
    if (!suc) {
      puts("NO");
      return 0;
    }
  }
exi:;
  if (!rec(k)) {
    puts("NO");
  } else {
    puts("YES");
    cout << res.size() << endl;
    for (auto e : res) {
      printf("%d %d\n", e.first + 1, e.second + 1);
    }
  }
  return 0;
}
