#include <bits/stdc++.h>
using namespace std;
const int maxn = 200000 + 5;
int n, k;
struct Point {
  int x, y;
  inline bool operator<(const Point &b) const {
    if (x != b.x) return x < b.x;
    return y < b.y;
  }
  inline Point(int _x = 0, int _y = 0) : x(_x), y(_y) {}
  inline Point operator-(const Point &b) const {
    return Point(x - b.x, y - b.y);
  }
  inline bool operator==(const Point &b) const { return x == b.x && y == b.y; }
};
Point p[maxn];
set<Point> vis, ans;
int main() {
  scanf("%d%d", &n, &k);
  if (k >= n) {
    puts("-1");
    return 0;
  }
  for (int i = 1; i <= n; ++i) scanf("%d%d", &p[i].x, &p[i].y);
  sort(p + 1, p + n + 1);
  for (int a = 1; a <= k + 1 && a <= n; ++a)
    for (int b = max(a, n - k); b <= n; ++b) {
      Point mid(p[a].x + p[b].x, p[a].y + p[b].y);
      if (vis.count(mid)) continue;
      vis.insert(mid);
      int cnt = 0;
      for (int i = 1, j = n; i <= j && cnt < n - k;) {
        if (p[i] == mid - p[i])
          ++cnt, ++i;
        else if (p[j] == mid - p[j])
          ++cnt, --j;
        else if (p[i] < mid - p[j])
          ++i;
        else if (mid - p[j] < p[i])
          --j;
        else
          cnt += 2, ++i, --j;
      }
      if (cnt >= n - k) ans.insert(mid);
    }
  printf("%d\n", (int)ans.size());
  for (set<Point>::iterator it = ans.begin(); it != ans.end(); ++it) {
    printf("%.1f %.1f\n", it->x * 0.5, it->y * 0.5);
  }
  return 0;
}
