#include <bits/stdc++.h>
using namespace std;
const int inf = 1e9 + 7;
const long long longinf = 1LL << 60;
const long long mod = 1e9 + 7;
const long long mod2 = 998244353;
const long double eps = 1e-10;
template <typename T1, typename T2>
inline void chmin(T1 &a, T2 b) {
  if (a > b) a = b;
}
template <typename T1, typename T2>
inline void chmax(T1 &a, T2 b) {
  if (a < b) a = b;
}
bool isNotAcute(
    tuple<long long, long long, long long, long long, long long> p1,
    tuple<long long, long long, long long, long long, long long> p2,
    tuple<long long, long long, long long, long long, long long> p3) {
  auto [a1, b1, c1, d1, e1] = p1;
  auto [a2, b2, c2, d2, e2] = p2;
  auto [a3, b3, c3, d3, e3] = p3;
  a2 -= a1;
  a3 -= a1;
  b2 -= b1;
  b3 -= b1;
  c2 -= c1;
  c3 -= c1;
  d2 -= d1;
  d3 -= d1;
  e2 -= e1;
  e3 -= e1;
  return a2 * a3 + b2 * b3 + c2 * c3 + d2 * d3 + e2 * e3 <= 0;
}
int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  int n;
  cin >> n;
  vector<tuple<long long, long long, long long, long long, long long>> P(n);
  for (int i = (int)(0); i < (int)(n); i++) {
    long long a, b, c, d, e;
    cin >> a >> b >> c >> d >> e;
    P[i] = {a, b, c, d, e};
  }
  queue<int> q;
  for (int i = (int)(0); i < (int)(n); i++) q.push(i);
  while (q.size() >= 3) {
    int i = q.front();
    q.pop();
    int j = q.front();
    q.pop();
    int k = q.front();
    q.pop();
    assert(i != j && j != k && k != i);
    if (isNotAcute(P[i], P[j], P[k])) q.push(i);
    if (isNotAcute(P[j], P[k], P[i])) q.push(j);
    if (isNotAcute(P[k], P[i], P[j])) q.push(k);
  }
  vector<int> ans;
  while (q.size()) {
    int i = q.front();
    q.pop();
    bool ok = true;
    for (int j = (int)(0); j < (int)(n); j++)
      for (int k = (int)(0); k < (int)(n); k++) {
        if (i == j || j == k || k == i) continue;
        if (!isNotAcute(P[i], P[j], P[k])) ok = false;
      }
    if (ok) ans.push_back(i + 1);
  }
  if (ans.size()) {
    cout << ans.size() << '\n';
    for (int a : ans) cout << a << ' ';
    cout << '\n';
  } else {
    cout << 0 << '\n';
  }
  return 0;
}

### Prompt

Please formulate a CPP solution to the following problem:

You are given set of n points in 5-dimensional space. The points are labeled from 1 to n. No two points coincide.

We will call point a bad if there are different points b and c, not equal to a, from the given set such that angle between vectors <image> and <image> is acute (i.e. strictly less than <image>). Otherwise, the point is called good.

The angle between vectors <image> and <image> in 5-dimensional space is defined as <image>, where <image> is the scalar product and <image> is length of <image>.

Given the list of points, print the indices of the good points in ascending order.

Input

The first line of input contains a single integer n (1 ≤ n ≤ 103) — the number of points.

The next n lines of input contain five integers ai, bi, ci, di, ei (|ai|, |bi|, |ci|, |di|, |ei| ≤ 103) — the coordinates of the i-th point. All points are distinct.

Output

First, print a single integer k — the number of good points.

Then, print k integers, each on their own line — the indices of the good points in ascending order.

Examples

Input

6
0 0 0 0 0
1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
0 0 0 0 1


Output

1
1


Input

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


Output

0

Note

In the first sample, the first point forms exactly a <image> angle with all other pairs of points, so it is good.

In the second sample, along the cd plane, we can see the points look as follows:

<image>

We can see that all angles here are acute, so no points are good.

### Response

```cpp
#include <bits/stdc++.h>
using namespace std;
const int inf = 1e9 + 7;
const long long longinf = 1LL << 60;
const long long mod = 1e9 + 7;
const long long mod2 = 998244353;
const long double eps = 1e-10;
template <typename T1, typename T2>
inline void chmin(T1 &a, T2 b) {
  if (a > b) a = b;
}
template <typename T1, typename T2>
inline void chmax(T1 &a, T2 b) {
  if (a < b) a = b;
}
bool isNotAcute(
    tuple<long long, long long, long long, long long, long long> p1,
    tuple<long long, long long, long long, long long, long long> p2,
    tuple<long long, long long, long long, long long, long long> p3) {
  auto [a1, b1, c1, d1, e1] = p1;
  auto [a2, b2, c2, d2, e2] = p2;
  auto [a3, b3, c3, d3, e3] = p3;
  a2 -= a1;
  a3 -= a1;
  b2 -= b1;
  b3 -= b1;
  c2 -= c1;
  c3 -= c1;
  d2 -= d1;
  d3 -= d1;
  e2 -= e1;
  e3 -= e1;
  return a2 * a3 + b2 * b3 + c2 * c3 + d2 * d3 + e2 * e3 <= 0;
}
int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  int n;
  cin >> n;
  vector<tuple<long long, long long, long long, long long, long long>> P(n);
  for (int i = (int)(0); i < (int)(n); i++) {
    long long a, b, c, d, e;
    cin >> a >> b >> c >> d >> e;
    P[i] = {a, b, c, d, e};
  }
  queue<int> q;
  for (int i = (int)(0); i < (int)(n); i++) q.push(i);
  while (q.size() >= 3) {
    int i = q.front();
    q.pop();
    int j = q.front();
    q.pop();
    int k = q.front();
    q.pop();
    assert(i != j && j != k && k != i);
    if (isNotAcute(P[i], P[j], P[k])) q.push(i);
    if (isNotAcute(P[j], P[k], P[i])) q.push(j);
    if (isNotAcute(P[k], P[i], P[j])) q.push(k);
  }
  vector<int> ans;
  while (q.size()) {
    int i = q.front();
    q.pop();
    bool ok = true;
    for (int j = (int)(0); j < (int)(n); j++)
      for (int k = (int)(0); k < (int)(n); k++) {
        if (i == j || j == k || k == i) continue;
        if (!isNotAcute(P[i], P[j], P[k])) ok = false;
      }
    if (ok) ans.push_back(i + 1);
  }
  if (ans.size()) {
    cout << ans.size() << '\n';
    for (int a : ans) cout << a << ' ';
    cout << '\n';
  } else {
    cout << 0 << '\n';
  }
  return 0;
}

```