#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = long double;
const ld eps = 1e-8;
template <class U, class V>
ostream& operator<<(ostream& out, const pair<U, V>& p) {
  return out << "(" << p.first << ", " << p.second << ")";
}
template <size_t i, class T>
ostream& print_tuple_utils(ostream& out, const T& tup) {
  if constexpr (i == tuple_size<T>::value)
    return out << ")";
  else
    return print_tuple_utils<i + 1, T>(out << (i ? ", " : "(") << get<i>(tup),
                                       tup);
}
template <class... U>
ostream& operator<<(ostream& out, const tuple<U...>& tup) {
  return print_tuple_utils<0, tuple<U...>>(out, tup);
}
template <class Con, class = decltype(begin(declval<Con>()))>
typename enable_if<!is_same<Con, string>::value, ostream&>::type operator<<(
    ostream& out, const Con& container) {
  out << "{";
  for (auto it = container.begin(); it != container.end(); ++it)
    out << (it == container.begin() ? "" : ", ") << *it;
  return out << "}";
}
template <class It1, class It2>
int count_unmatched(It1 beg1, It1 end1, It2 beg2, It2 end2) {
  int ans = 0;
  for (; beg1 != end1; ++beg1) {
    while (beg2 != end2 and *beg2 < *beg1) ++beg2;
    if (beg2 == end2)
      ++ans;
    else
      ans += *beg1 != *beg2;
  }
  return ans;
}
using pt = pair<int, int>;
const int maxn = 201010;
int n, k;
pt a[maxn];
bool can_be_center(const pt& cen_2) {
  ;
  static pt b[maxn];
  int f = n;
  for (int i = (int)(0); i < (int)(n); ++i) {
    --f;
    b[f].first = cen_2.first - a[i].first;
    b[f].second = cen_2.second - a[i].second;
  }
  assert(is_sorted(b, b + n));
  int cur_count = count_unmatched(a, a + n, b, b + n);
  if (0)
    cerr << "["
            "cen_2"
            " = "
         << (cen_2) << "] "
         << "["
            "cur_count"
            " = "
         << (cur_count) << "] " << endl;
  if (0)
    cerr << "["
            "vector<pt>(a, a + n)"
            " = "
         << (vector<pt>(a, a + n)) << "] " << endl;
  if (0)
    cerr << "["
            "vector<pt>(b, b + n)"
            " = "
         << (vector<pt>(b, b + n)) << "] " << endl;
  return cur_count <= k;
}
void print_half(int x) {
  if (x < 0) {
    cout << "-";
    print_half(-x);
    return;
  }
  cout << x / 2 << "." << (x % 2) * 5;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> k;
  for (int i = (int)(0); i < (int)(n); ++i) {
    cin >> a[i].first >> a[i].second;
    if (0) cerr << a[i] << endl;
  }
  sort(a, a + n);
  if (k >= n) {
    cout << "-1\n";
    return 0;
  }
  set<pt> possible_cen_2;
  for (int i = (int)(0); i < (int)(k + 1); ++i) {
    int rest = k - i;
    for (int f = (int)(0); f < (int)(rest + 1); ++f) {
      pt new_point = {a[i].first + a[n - 1 - f].first,
                      a[i].second + a[n - 1 - f].second};
      if (0)
        cerr << "["
                "a[i]"
                " = "
             << (a[i]) << "] "
             << "["
                "a[n - 1 - f]"
                " = "
             << (a[n - 1 - f]) << "] "
             << "["
                "new_point"
                " = "
             << (new_point) << "] " << endl;
      possible_cen_2.insert(new_point);
    }
  }
  if (0)
    cerr << "["
            "possible_cen_2"
            " = "
         << (possible_cen_2) << "] " << endl;
  vector<pt> ans;
  copy_if((possible_cen_2).begin(), (possible_cen_2).end(), back_inserter(ans),
          can_be_center);
  cout << ((int)ans.size()) << '\n';
  for (auto [x, y] : ans) {
    print_half(x);
    cout << ' ';
    print_half(y);
    cout << '\n';
  }
  return 0;
}
