#include <bits/stdc++.h>
using namespace std;
int N, K;
struct XY {
  double x, y;
  XY() {}
  XY(double _x, double _y) {
    x = _x;
    y = _y;
  }
  bool operator<(XY P) const { return x < P.x || x == P.x && y < P.y; }
} xy[300000];
map<XY, bool> M;
double mx, my;
bool check() {
  int _cnt = 0;
  int Ni = 0, Nj = N - 1;
  for (; Ni < N; Ni++) {
    while (Nj >= 0 && XY(2 * mx - xy[Ni].x, 2 * my - xy[Ni].y) < xy[Nj]) Nj--;
    if (Nj < 0 || xy[Nj] < XY(2 * mx - xy[Ni].x, 2 * my - xy[Ni].y)) _cnt++;
  }
  if (_cnt <= K)
    return true;
  else
    return false;
}
queue<double> print;
int main() {
  scanf("%d %d", &N, &K);
  for (int Ni = 0; Ni < N; Ni++) scanf("%lf %lf", &xy[Ni].x, &xy[Ni].y);
  sort(xy, xy + N);
  if (K >= N) {
    puts("-1");
    return 0;
  }
  int cnt = 0;
  for (int Ni = 0; Ni <= K; Ni++)
    for (int Nj = N - 1; Ni + N - 1 - Nj <= K; Nj--) {
      mx = (xy[Ni].x + xy[Nj].x) / 2;
      my = (xy[Ni].y + xy[Nj].y) / 2;
      if (M[XY(mx, my)]) continue;
      M[XY(mx, my)] = true;
      if (check()) {
        print.push(mx);
        print.push(my);
        cnt++;
      }
    }
  printf("%d\n", cnt);
  while (!print.empty()) {
    printf("%.9lf ", print.front());
    print.pop();
    printf("%.9lf\n", print.front());
    print.pop();
  }
}
