Problem: You are given n points on the plane. You need to delete exactly k of them (k < n) so that the diameter of the set of the remaining n - k points were as small as possible. The diameter of a set of points is the maximum pairwise distance between the points of the set. The diameter of a one point set equals zero.

Input

The first input line contains a pair of integers n, k (2 ≤ n ≤ 1000, 1 ≤ k ≤ 30, k < n) — the numbers of points on the plane and the number of points to delete, correspondingly.

Next n lines describe the points, one per line. Each description consists of a pair of integers xi, yi (0 ≤ xi, yi ≤ 32000) — the coordinates of the i-th point. The given points can coincide.

Output

Print k different space-separated integers from 1 to n — the numbers of points to delete. The points are numbered in the order, in which they are given in the input from 1 to n. You can print the numbers in any order. If there are multiple solutions, print any of them.

Examples

Input

5 2
1 2
0 0
2 2
1 1
3 3


Output

5 2

Input

4 1
0 0
0 0
1 1
1 1


Output

3

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
int n, K, x[1010], y[1010], flag[1010];
vector<int> v[1010];
bool dfs(int np, int m) {
  if (np == n + 1) return 1;
  if (flag[np]) return dfs(np + 1, m);
  if (!v[np].size()) return dfs(np + 1, m);
  for (int &x : v[np]) {
    m += !flag[x];
    flag[x]++;
  }
  if (m <= K && dfs(np + 1, m)) return 1;
  int tmp = m;
  for (int &x : v[np]) {
    flag[x]--;
    m -= !flag[x];
  }
  if (v[np].size() > 1) {
    flag[np]++;
    if (m + 1 <= K && m + 1 < tmp && dfs(np + 1, m + 1)) return 1;
    flag[np]--;
  }
  return 0;
}
bool check(double R) {
  for (int i = 1; i <= n; i++) v[i].clear();
  memset(flag, 0, sizeof(flag));
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      if ((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]) > R * R)
        v[i].push_back(j);
    }
  }
  return dfs(1, 0);
}
int main() {
  scanf("%d%d", &n, &K);
  if (K == n - 1) {
    for (int i = 2; i <= n; i++) printf("%d ", i);
    return 0;
  }
  for (int i = 1; i <= n; i++) scanf("%d%d", &x[i], &y[i]);
  double L = 0, R = 64000;
  vector<int> A;
  while (R - L > 1e-6) {
    double mid = (L + R) / 2;
    if (check(mid)) {
      R = mid;
      A.clear();
      for (int i = 1; i <= n; i++)
        if (flag[i]) A.push_back(i);
    } else
      L = mid;
  }
  if (A.size() < K) {
    bool f[1010];
    memset(f, 0, sizeof(f));
    for (int &x : A) f[x] = 1;
    for (int i = 1; i <= n; i++) {
      if (A.size() < K && !f[i]) A.push_back(i);
    }
  }
  for (int &x : A) printf("%d ", x);
  return 0;
}