#include <bits/stdc++.h>
using namespace std;
const int maxn = (int)1e5;
struct vt {
  double x;
  double y;
  vt() : x(0), y(0) {}
  vt(double x, double y) : x(x), y(y) {}
};
struct point {
  double a, b, c;
  point() : a(0), b(0), c(0) {}
  point(double a, double b, double c) : a(a), b(b), c(c) {}
};
const double eps = 1e-6;
bool operator<(vt a, vt b) {
  if (abs(a.x - b.x) < eps) {
    return a.y + eps < b.y;
  }
  return a.x + eps < b.x;
}
bool operator==(vt a, vt b) {
  return abs(a.x - b.x) < eps && abs(a.y - b.y) < eps;
}
vector<pair<int, int> > ans;
map<vt, int> m;
void add(point a, point b) {
  double d = a.a * b.b - a.b * b.a;
  a.c = -a.c;
  b.c = -b.c;
  double dx = a.c * b.b - a.b * b.c;
  double dy = a.a * b.c - b.a * a.c;
  if (d == 0) {
    return;
  }
  m[vt(dx / d, dy / d)]++;
}
bool go(vector<pair<point, int> > &v, int k) {
  if (v.empty()) {
    return true;
  }
  if (k == 0) {
    return false;
  }
  if ((int)v.size() <= k) {
    for (int i = 0; i < (int)v.size(); i++) {
      ans.push_back(make_pair(v[i].second, -1));
    }
    return true;
  }
  if ((int)v.size() > k * k) {
    for (int it = 0; it < 10; it++) {
      m.clear();
      int pos = rand() % (int)v.size();
      for (int i = 0; i < (int)v.size(); i++) {
        add(v[pos].first, v[i].first);
      }
      vt f;
      int cnt = 0;
      for (auto i = m.begin(); i != m.end(); i++) {
        if (i->second > cnt) {
          cnt = i->second;
          f = i->first;
        }
      }
      if (cnt >= k) {
        vector<pair<point, int> > t;
        bool st = true;
        for (int i = 0; i < (int)v.size(); i++) {
          if (i != pos) {
            point a = v[pos].first;
            point b = v[i].first;
            double d = a.a * b.b - a.b * b.a;
            a.c = -a.c;
            b.c = -b.c;
            double dx = a.c * b.b - a.b * b.c;
            double dy = a.a * b.c - b.a * a.c;
            if (d == 0 || !(vt(dx / d, dy / d) == f)) {
              t.push_back(v[i]);
            } else if (st) {
              st = false;
              ans.push_back(make_pair(v[pos].second, v[i].second));
            }
          }
        }
        return go(t, k - 1);
      }
    }
  } else {
    for (int it = 0; it < 1; it++) {
      m.clear();
      int pos = rand() % (int)v.size();
      for (int i = 0; i < (int)v.size(); i++) {
        add(v[pos].first, v[i].first);
      }
      vt f = m.rbegin()->first;
      vector<pair<point, int> > t;
      bool st = true;
      for (int i = 0; i < (int)v.size(); i++) {
        if (i != pos) {
          point a = v[pos].first;
          point b = v[i].first;
          double d = a.a * b.b - a.b * b.a;
          a.c = -a.c;
          b.c = -b.c;
          double dx = a.c * b.b - a.b * b.c;
          double dy = a.a * b.c - b.a * a.c;
          if (d == 0 || !(vt(dx / d, dy / d) == f)) {
            t.push_back(v[i]);
          } else if (st) {
            st = false;
            ans.push_back(make_pair(v[pos].second, v[i].second));
          }
        }
      }
      if (go(t, k - 1)) {
        return true;
      } else {
        ans.pop_back();
      }
    }
  }
  return false;
}
int main() {
  vector<pair<point, int> > v;
  int n, k;
  cin >> n >> k;
  for (int i = 0; i < n; i++) {
    point a;
    scanf("%lf %lf %lf", &a.a, &a.b, &a.c);
    v.push_back(make_pair(a, i + 1));
  }
  if (!go(v, k)) {
    cout << "NO" << endl;
    return 0;
  }
  cout << "YES" << endl;
  cout << (int)ans.size() << endl;
  for (int i = 0; i < (int)ans.size(); i++) {
    cout << ans[i].first << ' ' << ans[i].second << endl;
  }
  return 0;
}
