#include <bits/stdc++.h>
using namespace std;
struct point {
  long long x, y;
  point(long long _x = 0, long long _y = 0) {
    x = _x;
    y = _y;
  }
  point operator-(point w) { return point(x - w.x, y - w.y); }
  point operator+(point w) { return point(x + w.x, y + w.y); }
  point half() { return point(x / 2, y / 2); }
  point twice() { return point(2 * x, 2 * y); }
  bool operator<(const point& w) const {
    return (x < w.x || x == w.x && y < w.y);
  }
  bool operator==(const point& w) const { return (x == w.x && y == w.y); }
};
int n, m;
point in[200010];
set<point> ans;
bool OK(point w) {
  w = w.twice();
  int bad = 0, end = n - 1;
  for (int i = 0; i < n; ++i) {
    point neo = w - in[i];
    while (end - 1 >= 0 && (neo < in[end - 1] || neo == in[end - 1])) --end;
    if (!(neo == in[end])) ++bad;
  }
  return (bad <= m);
}
int main() {
  scanf("%d%d", &n, &m);
  if (m >= n) {
    printf("-1\n");
    return 0;
  }
  for (int i = 0; i < n; ++i) {
    int x, y;
    scanf("%d%d", &x, &y);
    in[i].x = 2 * x;
    in[i].y = 2 * y;
  }
  sort(in, in + n);
  for (int le = 0; le <= m; ++le)
    for (int re = 0; re <= m - le; ++re) {
      point mid = (in[le] + in[n - 1 - re]).half();
      if (OK(mid)) ans.insert(mid);
    }
  printf("%d\n", ans.size());
  for (set<point>::iterator it = ans.begin(); it != ans.end(); ++it)
    printf("%.2lf %.2lf\n", it->x / 2.0, it->y / 2.0);
  return 0;
}
