#include <bits/stdc++.h>
using namespace std;
struct point {
  int x, y;
  point(int _x = 0, int _y = 0) : x(_x), y(_y) {}
  bool operator<(const point &o) const {
    return x < o.x || x == o.x && y < o.y;
  }
} p[200000];
int main() {
  int n, k;
  scanf("%d%d", &n, &k);
  if (k >= n) {
    printf("-1\n");
    return 0;
  }
  for (int i = 0; i < n; i++) scanf("%d%d", &p[i].x, &p[i].y);
  sort(p, p + n);
  vector<pair<int, int> > ans;
  for (int i = 0; i <= k; i++)
    for (int j = 0; i + j <= k; j++) {
      int t = k - i - j;
      int _x = p[i].x + p[n - j - 1].x;
      int _y = p[i].y + p[n - j - 1].y;
      bool flag = true;
      for (int l = i; l < n - j; l++) {
        int loc = lower_bound(p, p + n, point(_x - p[l].x, _y - p[l].y)) - p;
        if (p[loc].x + p[l].x != _x || p[loc].y + p[l].y != _y) {
          if (t == 0) {
            flag = false;
            break;
          }
          t--;
        }
      }
      if (flag) ans.push_back(make_pair(_x, _y));
    }
  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("%.1lf %.1lf\n", (double)ans[i].first / 2,
           (double)ans[i].second / 2);
  return 0;
}
