#include <bits/stdc++.h>
using namespace std;
const int MOD = 1000000007;
template <class T>
typename T::value_type arr_sum(const T &v, int n) {
  typename T::value_type sum = 0;
  for (int i = (0); i < (n); ++i) sum += v[i];
  return sum;
}
struct Sync_stdio {
  Sync_stdio() {
    cin.tie(NULL);
    ios_base::sync_with_stdio(false);
  }
} _sync_stdio;
struct Z {
  long long a;
  long long b;
  long long c;
};
vector<Z> v;
vector<pair<int, int>> ans;
double dist1(const pair<double, double> &x, const pair<double, double> &y) {
  return abs(x.first - y.first) + abs(x.second - y.second);
}
pair<double, double> intersect(int x, int y) {
  long long det = v[x].a * v[y].b - v[x].b * v[y].a;
  if (det == 0) {
    return {NAN, NAN};
  }
  pair<double, double> ans;
  ans.first = -(v[x].c * v[y].b - v[x].b * v[y].c) * 1.0 / det;
  ans.second = -(v[x].a * v[y].c - v[x].c * v[y].a) * 1.0 / det;
  return ans;
}
int n, k;
const double EPS = 1e-7;
void print() {
  cout << "YES"
       << "\n";
  cout << ans.size() << "\n";
  for (auto i : ans) {
    cout << i.first + 1 << " " << i.second + 1 << "\n";
  }
}
double get_rand(int low, int high) {
  return rand() / (RAND_MAX + 1.0) * (high - low) + low;
}
void rec(const vector<int> &a, int k) {
  if (a.size() <= k) {
    for (int i = (0); i < (a.size()); ++i) {
      ans.push_back({i, -2});
    }
    print();
    exit(0);
  }
  if (k == 1) {
    pair<double, double> x = intersect(a[0], a[1]);
    if (x.first != x.first) {
      return;
    }
    for (int l = (2); l < (a.size()); ++l) {
      double y = v[a[l]].a * x.first + v[a[l]].b * x.second + v[a[l]].c;
      if (abs(y) >= EPS) {
        return;
      }
    }
    ans.push_back({a[0], a[1]});
    print();
    exit(0);
  }
  if (a.size() > 1000) {
    for (int i = (0); i < (100); ++i) {
      int x = get_rand(0, a.size());
      vector<pair<double, double>> b;
      for (auto j : a) {
        if (j == x) {
          continue;
        }
        b.push_back(intersect(x, j));
        if (b.back().first != b.back().first) {
          b.pop_back();
        }
      }
      sort(b.begin(), b.end());
      int c = 1;
      int ok = 0;
      int j2 = -1;
      for (int j = (1); j < (b.size()); ++j) {
        if (dist1(b[j], b[j - 1]) < EPS) {
          ++c;
        } else {
          c = 1;
        }
        if (c >= k + 1) {
          ok = 1;
          j2 = j;
          break;
        }
      }
      vector<int> b2;
      int y = -1;
      if (ok) {
        for (auto i : a) {
          if (i == x) {
            continue;
          }
          if (abs(v[i].a * b[j2].first + v[i].b * b[j2].second + v[i].c) <
              EPS) {
            y = i;
          } else {
            b2.push_back(i);
          }
        }
        ans.push_back({x, y});
        rec(b2, k - 1);
        return;
      }
    }
    cout << "NO";
    exit(0);
  }
  for (int i = (0); i < (k + 1); ++i) {
    for (int j = (i + 1); j < (k + 1); ++j) {
      pair<double, double> x = intersect(a[i], a[j]);
      if (x.first != x.first) {
        continue;
      }
      vector<int> b;
      for (auto l : a) {
        if (l == a[i] || l == a[j]) {
          continue;
        }
        double y = v[l].a * x.first + v[l].b * x.second + v[l].c;
        if (abs(y) >= EPS) {
          b.push_back(l);
        }
      }
      ans.push_back({a[i], a[j]});
      rec(b, k - 1);
      ans.pop_back();
    }
  }
}
int main() {
  srand(17289378);
  cin >> n >> k;
  v.resize(n);
  for (int i = (0); i < (n); ++i) {
    cin >> v[i].a >> v[i].b >> v[i].c;
  }
  vector<int> t;
  for (int i = (0); i < (n); ++i) {
    t.push_back(i);
  }
  rec(t, k);
  cout << "NO";
  return 0;
}
