#include <bits/stdc++.h>
using namespace std;
const int MaxN = 1e5 + 5, RandomCount = 100;
const double eps = 1e-8;
struct Line {
  long long a, b, c;
  inline Line() {}
  inline Line(int _a, int _b, int _c) : a(_a), b(_b), c(_c) {}
} edges[MaxN];
inline int Random(int l, int r) {
  static mt19937 gen;
  uniform_int_distribution<> dist(l, r);
  return dist(gen);
}
inline bool NotIntersects(const Line &a, const Line &b) {
  return 1LL * a.a * b.b == 1LL * a.b * b.a;
}
vector<pair<int, int> > ans;
bool dfs(const vector<int> &v, int k) {
  if (v.size() <= k) {
    for (int x : v) ans.emplace_back(make_pair(x + 1, -1));
    return true;
  }
  if (k == 0) return false;
  if (v.size() > 30LL * k * k) {
    for (int t = 0; t < RandomCount; ++t) {
      int i = Random(0, v.size() - 1), j = Random(0, v.size() - 2);
      if (NotIntersects(edges[v[i]], edges[v[j]])) continue;
      if (j >= i) ++j;
      if (edges[v[i]].b == 0) swap(i, j);
      double x = (double)(edges[v[j]].c * edges[v[i]].b -
                          edges[v[i]].c * edges[v[j]].b) /
                 (double)(edges[v[i]].a * edges[v[j]].b -
                          edges[v[i]].b * edges[v[j]].a),
             y = -(double)(edges[v[i]].a * x + edges[v[i]].c) /
                 (double)edges[v[i]].b;
      vector<int> n;
      for (const auto &q : v)
        if (fabs((double)(edges[q].a * x + edges[q].b * y + edges[q].c)) > eps)
          n.emplace_back(q);
      if (v.size() - n.size() > k) {
        ans.emplace_back(make_pair(v[i] + 1, v[j] + 1));
        if (dfs(n, k - 1)) return true;
        ans.pop_back();
        return false;
      }
    }
    return false;
  }
  for (int i = 0; i <= k; ++i)
    for (int j = i + 1; j <= k; ++j) {
      if (NotIntersects(edges[v[i]], edges[v[j]])) continue;
      ans.emplace_back(make_pair(v[i] + 1, v[j] + 1));
      int t = edges[v[i]].b == 0 ? j : i;
      double x = (double)(edges[v[j]].c * edges[v[i]].b -
                          edges[v[i]].c * edges[v[j]].b) /
                 (double)(edges[v[i]].a * edges[v[j]].b -
                          edges[v[i]].b * edges[v[j]].a),
             y = -(double)(edges[v[t]].a * x + edges[v[t]].c) /
                 (double)edges[v[t]].b;
      vector<int> n;
      for (const auto &q : v)
        if (fabs((double)(edges[q].a * x + edges[q].b * y + edges[q].c)) > eps)
          n.emplace_back(q);
      if (dfs(n, k - 1)) return true;
      ans.pop_back();
    }
  return false;
}
int main() {
  ios_base::sync_with_stdio(false);
  int n, k;
  cin >> n >> k;
  vector<int> v;
  for (int i = 0; i < n; ++i) {
    cin >> edges[i].a >> edges[i].b >> edges[i].c;
    v.emplace_back(i);
  }
  if (dfs(v, k)) {
    cout << "YES" << endl << ans.size() << endl;
    for (const auto &pi : ans) cout << pi.first << ' ' << pi.second << endl;
  } else
    cout << "NO" << endl;
  return 0;
}
