#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e6 + 10;
const int inf = 0x7f7f7f7f;
const long long inf_ll = 1ll * inf * inf;
const int Mod = 1e9 + 7;
const double eps = 1e-7;
int n, k;
struct point {
  int x, y;
  point() {}
  point(int xx, int yy) : x(xx), y(yy) {}
  bool operator<(const point& rhs) const {
    return x == rhs.x ? y < rhs.y : x < rhs.x;
  }
  point operator+(const point& rhs) const {
    return point(x + rhs.x, y + rhs.y);
  }
  bool operator==(const point& rhs) const { return x == rhs.x && y == rhs.y; }
} p[maxn];
vector<pair<double, double> > ans;
bool cmp(point a, point b) { return a.x == b.x ? a.y > b.y : a.x > b.x; }
bool check(point t) {
  int l = 0, r = n - 1, cnt = 0;
  while (l <= r) {
    if (p[l] + p[r] == t)
      l++, r--;
    else if (p[l] + p[r] < t)
      l++, cnt++;
    else
      r--, cnt++;
    if (cnt > k) return 0;
  }
  return 1;
}
int main() {
  scanf("%d%d", &n, &k);
  for (int i = 0; i < n; i++) scanf("%d%d", &p[i].x, &p[i].y);
  if (k >= n) {
    puts("-1");
    return 0;
  }
  sort(p, p + n);
  for (int i = 0; i <= k; i++) {
    for (int j = n - k - 1; j < n; j++) {
      point t = p[i] + p[j];
      if (check(t)) {
        ans.push_back({1.0 * t.x / 2, 1.0 * t.y / 2});
      }
    }
  }
  sort(ans.begin(), ans.end());
  ans.erase(unique(ans.begin(), ans.end()), ans.end());
  printf("%d\n", ans.size());
  for (int i = 0; i < ans.size(); i++)
    printf("%.6f %.6f\n", ans[i].first, ans[i].second);
  return 0;
}
