#include <bits/stdc++.h>
using namespace std;
const int maxN = 1e3 + 3;
const double EPS = 1e-5;
vector<vector<int> > v(maxN, vector<int>(6));
queue<vector<int> > q;
bool cmp(const double& d, const double& e) { return d + EPS > e; }
double dot(vector<int>& v, vector<int>& u) {
  double k = 0;
  for (int i = 0; i < (5); ++i) k += v[i] * u[i];
  return k;
}
vector<int> toVec(vector<int>& v, vector<int>& u) {
  vector<int> x(5);
  for (int i = 0; i < (5); ++i) {
    x[i] = u[i] - v[i];
  }
  return x;
}
bool t(vector<int>& v, vector<int>& u, vector<int>& x) {
  vector<int> a, b, c;
  a = toVec(v, u);
  b = toVec(v, x);
  return cmp(acos(dot(a, b) / (sqrt(dot(a, a)) * sqrt(dot(b, b)))),
             3.141592653589793 / 2.0);
}
void solve() {
  vector<int> v, u, x, a, b, c;
  v = q.front(), q.pop();
  u = q.front(), q.pop();
  x = q.front(), q.pop();
  if (t(v, u, x))
    q.push(v);
  else if (t(u, x, v))
    q.push(u);
  else if (t(x, v, u))
    q.push(x);
}
bool test(vector<int>& u, int n) {
  for (int i = 0; i < (n); ++i) {
    if (i != u[5])
      for (int j = (i + 1); j < (n); ++j)
        if (j != u[5])
          if (!t(u, v[i], v[j])) return false;
  }
  return true;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  int n, c = -1;
  cin >> n;
  for (int i = 0; i < (n); ++i) {
    for (int j = 0; j < (5); ++j) cin >> v[i][j];
    v[i][5] = i;
    q.push(v[i]);
  }
  if (n < 3) {
    cout << n << "\n";
    for (int i = 0; i < (n); ++i) cout << i + 1 << "\n";
  } else {
    while (q.size() > 2) solve();
    if (!q.empty()) {
      if (test(q.front(), n)) c = q.front()[5] + 1;
      q.pop();
      if (c == -1 && !q.empty() && test(q.front(), n)) c = q.front()[5] + 1;
    }
    if (c == -1)
      cout << 0 << "\n";
    else
      cout << 1 << "\n" << c << "\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 maxN = 1e3 + 3;
const double EPS = 1e-5;
vector<vector<int> > v(maxN, vector<int>(6));
queue<vector<int> > q;
bool cmp(const double& d, const double& e) { return d + EPS > e; }
double dot(vector<int>& v, vector<int>& u) {
  double k = 0;
  for (int i = 0; i < (5); ++i) k += v[i] * u[i];
  return k;
}
vector<int> toVec(vector<int>& v, vector<int>& u) {
  vector<int> x(5);
  for (int i = 0; i < (5); ++i) {
    x[i] = u[i] - v[i];
  }
  return x;
}
bool t(vector<int>& v, vector<int>& u, vector<int>& x) {
  vector<int> a, b, c;
  a = toVec(v, u);
  b = toVec(v, x);
  return cmp(acos(dot(a, b) / (sqrt(dot(a, a)) * sqrt(dot(b, b)))),
             3.141592653589793 / 2.0);
}
void solve() {
  vector<int> v, u, x, a, b, c;
  v = q.front(), q.pop();
  u = q.front(), q.pop();
  x = q.front(), q.pop();
  if (t(v, u, x))
    q.push(v);
  else if (t(u, x, v))
    q.push(u);
  else if (t(x, v, u))
    q.push(x);
}
bool test(vector<int>& u, int n) {
  for (int i = 0; i < (n); ++i) {
    if (i != u[5])
      for (int j = (i + 1); j < (n); ++j)
        if (j != u[5])
          if (!t(u, v[i], v[j])) return false;
  }
  return true;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  int n, c = -1;
  cin >> n;
  for (int i = 0; i < (n); ++i) {
    for (int j = 0; j < (5); ++j) cin >> v[i][j];
    v[i][5] = i;
    q.push(v[i]);
  }
  if (n < 3) {
    cout << n << "\n";
    for (int i = 0; i < (n); ++i) cout << i + 1 << "\n";
  } else {
    while (q.size() > 2) solve();
    if (!q.empty()) {
      if (test(q.front(), n)) c = q.front()[5] + 1;
      q.pop();
      if (c == -1 && !q.empty() && test(q.front(), n)) c = q.front()[5] + 1;
    }
    if (c == -1)
      cout << 0 << "\n";
    else
      cout << 1 << "\n" << c << "\n";
  }
  return 0;
}

```