#include <bits/stdc++.h>
using namespace std;
template <class a, class b>
pair<a, b> operator+(pair<a, b> x, pair<a, b> y) {
  return (pair<a, b>(x.first + y.first, x.second + y.second));
}
template <class t>
ostream &operator<<(ostream &tout, const vector<t> &s) {
  tout << '[';
  for (long long i = 0; i < s.size(); i++)
    if (i + 1 == s.size())
      tout << s[i];
    else
      tout << s[i] << ',';
  tout << ']';
  return (tout);
}
template <class a, class b>
ostream &operator<<(ostream &tout, const pair<a, b> &c) {
  return (tout << '(' << c.first << ',' << c.second << ')');
}
const long long MAX_N = 200000 + 20;
const complex<double> change(1.42423, 1.31231);
pair<long long, long long> num[MAX_N];
long long n, order[MAX_N], k;
bool df(long long a, long long b) {
  double x = (complex<double>(num[a].first, num[a].second) * change).real();
  double y = (complex<double>(num[b].first, num[b].second) * change).real();
  return (x < y);
}
pair<long long, long long> first[MAX_N], second[MAX_N];
long long amount() {
  long long p1 = 1, p2 = 1, ans = 0;
  while (p1 <= n && p2 <= n) {
    if (first[p1] < second[p2]) {
      ans++;
      p1++;
      continue;
    }
    if (first[p1] > second[p2]) {
      ans++;
      p2++;
      continue;
    }
    p1++;
  }
  ans += (n + 1) * 2 - p1 - p2;
  return (ans);
}
int main() {
  cout << fixed;
  cout.precision(1);
  ios_base::sync_with_stdio(false);
  cin >> n >> k;
  if (k >= n) {
    cout << -1 << endl;
    return (0);
  }
  for (long long i = 1; i <= n; i++) {
    cin >> num[i].first >> num[i].second;
    num[i].first *= 2;
    num[i].second *= 2;
  }
  vector<pair<long long, long long> > candidates;
  for (long long i = 1; i <= n; i++) order[i] = i;
  sort(order + 1, order + n + 1, df);
  for (long long i = 1; i <= n && i <= 11; i++)
    for (long long j = n; j >= 1 && j >= n - 10; j--)
      if (i - 1 + n - j <= k)
        candidates.push_back(pair<long long, long long>(
            (num[order[i]].first + num[order[j]].first) / 2,
            (num[order[i]].second + num[order[j]].second) / 2));
  vector<pair<long long, long long> > result;
  sort(candidates.begin(), candidates.end());
  candidates.resize(unique(candidates.begin(), candidates.end()) -
                    candidates.begin());
  for (long long i = 1; i <= n; i++) first[i] = num[i];
  sort(first + 1, first + n + 1);
  for (long long i = 1; i <= n; i++)
    second[i] = pair<long long, long long>(-first[n - i + 1].first,
                                           -first[n - i + 1].second);
  for (long long i = 0; i < candidates.size(); i++) {
    if (i == 0)
      for (long long j = 1; j <= n; j++) {
        second[j].first += 2 * candidates[i].first;
        second[j].second += 2 * candidates[i].second;
      }
    else
      for (long long j = 1; j <= n; j++) {
        second[j].first += 2 * (candidates[i].first - candidates[i - 1].first);
        second[j].second +=
            2 * (candidates[i].second - candidates[i - 1].second);
      }
    if (amount() <= n + k) result.push_back(candidates[i]);
  }
  cout << result.size() << endl;
  for (long long i = 0; i < result.size(); i++)
    cout << ((double)result[i].first) / 2 << ' '
         << ((double)result[i].second) / 2 << endl;
}
