#include <bits/stdc++.h>
using namespace std;
const int N = 200005;
struct Point {
  double x, y;
} a[N];
Point operator+(const Point &a, const Point &b) {
  return {a.x + b.x, a.y + b.y};
};
bool operator<(const Point &a, const Point &b) {
  return a.x < b.x || (a.x == b.x && a.y < b.y);
}
bool operator==(const Point &a, const Point &b) {
  return a.x == b.x && a.y == b.y;
}
int n, kk;
bool check(Point p) {
  int l = 1, r = n, cnt = 0;
  p.x *= 2;
  p.y *= 2;
  while (l <= r) {
    if (a[l] + a[r] == p)
      ++l, --r;
    else if (a[l] + a[r] < p)
      ++l, ++cnt;
    else
      --r, ++cnt;
    if (cnt > kk) return 0;
  }
  return 1;
}
int main() {
  scanf("%d%d", &n, &kk);
  if (kk >= n) {
    cout << -1 << endl;
    return 0;
  }
  for (int i = 1; i <= n; i++) scanf("%lf%lf", &a[i].x, &a[i].y);
  sort(a + 1, a + n + 1);
  vector<Point> ans;
  for (int i = 1; i <= kk + 1; i++)
    for (int j = 1; j <= kk + 1; j++)
      if (check({(a[i].x + a[n - j + 1].x) / 2, (a[i].y + a[n - j + 1].y) / 2}))
        ans.push_back(
            {(a[i].x + a[n - j + 1].x) / 2, (a[i].y + a[n - j + 1].y) / 2});
  sort(ans.begin(), ans.end());
  ans.erase(unique(ans.begin(), ans.end()), ans.end());
  printf("%d\n", int(ans.size()));
  for (auto &i : ans) printf("%.8lf %.8lf\n", i.x, i.y);
  return 0;
}
