#include <bits/stdc++.h>
using namespace std;
const int inf = 0x0f0f0f0f;
template <class S, class T>
inline pair<S, T> MP(S a, T b) {
  return make_pair(a, b);
}
template <class T>
inline auto LX(T &X) -> decltype((X.first)) {
  return X.first;
}
template <class T>
inline auto LX(const T &X) -> const decltype((X.first)) {
  return X.first;
}
template <class T>
inline auto RX(T &X) -> decltype((X.second)) {
  return X.second;
}
template <class T>
inline auto RX(const T &X) -> const decltype((X.second)) {
  return X.second;
}
template <class T>
inline void RST(T &a) {
  memset(a, 0, sizeof(a));
}
template <class T>
inline void RST1(T &a) {
  memset(a, -1, sizeof(a));
}
template <class T>
inline void SINF(T &a) {
  memset(a, 0x0f, sizeof(a));
}
template <class S, class T>
inline void RST(S &a, T b) {
  fill((T *)a, (T *)a + (sizeof(a) / sizeof(b)), b);
}
template <class T>
inline void CLR(T &a) {
  a.clear();
}
template <class S, class T>
inline void CPY(S &a, T &b) {
  memcpy(a, b, sizeof(a));
}
template <class S, class T>
inline bool chkmin(S &a, T b) {
  return b < a ? a = b, 1 : 0;
}
template <class S, class T>
inline bool chkmax(S &a, T b) {
  return a < b ? a = b, 1 : 0;
}
template <class T>
inline T sqr(T x) {
  return x * x;
}
template <class T>
inline int SZ(T &a) {
  return (int)(a.size());
}
template <class T>
inline bool EPT(T &a) {
  return a.empty();
}
template <class T>
inline auto FRT(T &a) -> decltype((a.front())) {
  return a.front();
}
template <class T>
inline auto FRT(const T &a) -> const decltype((a.front())) {
  return a.front();
}
template <class T>
inline auto BK(T &a) -> decltype(a.back()) & {
  return a.back();
}
template <class T>
inline auto BK(const T &a) -> const decltype((a.back())) {
  return a.back();
}
template <class T>
inline auto TOP(T &a) -> decltype((a.top())) {
  return a.top();
}
template <class T>
inline auto TOP(const T &a) -> const decltype((a.top())) {
  return a.top();
}
int n, k;
pair<int, int> a[200010];
struct Hash {
  size_t operator()(const pair<int, int> &a) const {
    return LX(a) * 1000000007 + RX(a);
  }
};
unordered_set<pair<int, int>, Hash> ans, s, vis;
pair<int, int> operator+(const pair<int, int> a, const pair<int, int> b) {
  return MP(LX(a) + LX(b), RX(a) + RX(b));
}
pair<int, int> operator-(const pair<int, int> a, const pair<int, int> b) {
  return MP(LX(a) - LX(b), RX(a) - RX(b));
}
int main() {
  scanf("%d%d", &n, &k);
  if (k >= n) return puts("-1"), 0;
  for (int i = 1; i <= n; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    a[i] = MP(x, y);
    s.insert(a[i]);
  }
  sort(a + 1, a + n + 1);
  for (int i = 1; i <= k + 1; i++)
    for (int j = n - k; j <= n; j++) {
      pair<int, int> t = a[i] + a[j];
      if (vis.count(t)) continue;
      vis.insert(t);
      int cnt = 0;
      for (int p = 1; p <= n; p++)
        if (cnt > k)
          break;
        else if (!s.count(t - a[p]))
          cnt++;
      if (cnt <= k) ans.insert(t);
    }
  printf("%d\n", SZ(ans));
  for (auto x : ans) printf("%.1lf %.1lf\n", 0.5 * LX(x), 0.5 * RX(x));
  return 0;
}
