#include <bits/stdc++.h>
using namespace std;
long long inp;
long long i1, i2, i3, i4, i5, i6, i7, i8;
long long mov = (long long)1e9 + 7;
using Point = complex<double>;
const double kPi = 4.0 * atan(1.0);
const double kEps = 1e-9;
double dot(Point a, Point b) { return (conj(a) * b).real(); }
double cross(Point a, Point b) { return (conj(a) * b).imag(); }
double dist(Point a, Point b) { return abs(b - a); }
Point perp(Point a) { return Point{-a.imag(), a.real()}; }
template <class P>
int segmentIntersection(const P& s1, const P& e1, const P& s2, const P& e2,
                        P& r1, P& r2) {
  if (e1 == s1) {
    if (e2 == s2) {
      if (e1 == e2) {
        r1 = e1;
        return 1;
      } else
        return 0;
    } else
      return segmentIntersection(s2, e2, s1, e1, r1, r2);
  }
  P v1 = e1 - s1, v2 = e2 - s2, d = s2 - s1;
  auto a = cross(v1, v2), a1 = cross(v1, d), a2 = cross(v2, d);
  if (a == 0) {
    auto b1 = dot(s1, v1), c1 = dot(e1, v1), b2 = dot(s2, v1), c2 = dot(e2, v1);
    if (a1 || a2 || max(b1, min(b2, c2)) > min(c1, max(b2, c2))) return 0;
    r1 = min(b2, c2) < b1 ? s1 : (b2 < c2 ? s2 : e2);
    r2 = max(b2, c2) > c1 ? e1 : (b2 > c2 ? s2 : e2);
    return 2 - (r1 == r2);
  }
  if (a < 0) {
    a = -a;
    a1 = -a1;
    a2 = -a2;
  }
  if (0 < a1 || a < -a1 || 0 < a2 || a < -a2) return 0;
  r1 = s1 - v1 * a2 / a;
  return 1;
}
double eval(vector<long long> a, vector<long long> b, vector<long long> c) {
  double dotp = 0;
  for (int i = (0); i < (5); i++) {
    dotp += ((double)b.at(i) - a.at(i)) * ((double)c.at(i) - a.at(i));
  }
  double abv = 0;
  double usqt = 0;
  for (int i = (0); i < (5); i++) {
    usqt += ((double)b.at(i) - a.at(i)) * ((double)b.at(i) - a.at(i));
  }
  abv += (double)sqrt(usqt);
  usqt = 0;
  for (int i = (0); i < (5); i++) {
    usqt += ((double)c.at(i) - a.at(i)) * ((double)c.at(i) - a.at(i));
  }
  abv *= (double)sqrt(usqt);
  return (acos(dotp / abv));
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.precision(20);
  long long n;
  cin >> n;
  vector<vector<long long>> v;
  for (int i = (0); i < (n); i++) {
    cin >> i1 >> i2 >> i3 >> i4 >> i5;
    vector<long long> vpb{i1, i2, i3, i4, i5};
    v.push_back(vpb);
  }
  long long r = 0;
  vector<long long> rv;
  for (int i = (0); i < (n); i++) {
    for (int j = (0); j < (n); j++) {
      for (int k = (0); k < (n); k++) {
        if (k != j && j != i && i != k) {
          if (eval(v.at(i), v.at(j), v.at(k)) < 3.1415926535897932384626 / 2) {
            j = n;
            k = n;
          }
        }
        if (j == n - 1 && k == n - 1) {
          rv.push_back(i);
          r++;
        }
      }
    }
  }
  cout << r << "\n";
  for (auto it : rv) {
    cout << it + 1 << "\n";
  }
  return 0;
}

### Prompt

Generate 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;
long long inp;
long long i1, i2, i3, i4, i5, i6, i7, i8;
long long mov = (long long)1e9 + 7;
using Point = complex<double>;
const double kPi = 4.0 * atan(1.0);
const double kEps = 1e-9;
double dot(Point a, Point b) { return (conj(a) * b).real(); }
double cross(Point a, Point b) { return (conj(a) * b).imag(); }
double dist(Point a, Point b) { return abs(b - a); }
Point perp(Point a) { return Point{-a.imag(), a.real()}; }
template <class P>
int segmentIntersection(const P& s1, const P& e1, const P& s2, const P& e2,
                        P& r1, P& r2) {
  if (e1 == s1) {
    if (e2 == s2) {
      if (e1 == e2) {
        r1 = e1;
        return 1;
      } else
        return 0;
    } else
      return segmentIntersection(s2, e2, s1, e1, r1, r2);
  }
  P v1 = e1 - s1, v2 = e2 - s2, d = s2 - s1;
  auto a = cross(v1, v2), a1 = cross(v1, d), a2 = cross(v2, d);
  if (a == 0) {
    auto b1 = dot(s1, v1), c1 = dot(e1, v1), b2 = dot(s2, v1), c2 = dot(e2, v1);
    if (a1 || a2 || max(b1, min(b2, c2)) > min(c1, max(b2, c2))) return 0;
    r1 = min(b2, c2) < b1 ? s1 : (b2 < c2 ? s2 : e2);
    r2 = max(b2, c2) > c1 ? e1 : (b2 > c2 ? s2 : e2);
    return 2 - (r1 == r2);
  }
  if (a < 0) {
    a = -a;
    a1 = -a1;
    a2 = -a2;
  }
  if (0 < a1 || a < -a1 || 0 < a2 || a < -a2) return 0;
  r1 = s1 - v1 * a2 / a;
  return 1;
}
double eval(vector<long long> a, vector<long long> b, vector<long long> c) {
  double dotp = 0;
  for (int i = (0); i < (5); i++) {
    dotp += ((double)b.at(i) - a.at(i)) * ((double)c.at(i) - a.at(i));
  }
  double abv = 0;
  double usqt = 0;
  for (int i = (0); i < (5); i++) {
    usqt += ((double)b.at(i) - a.at(i)) * ((double)b.at(i) - a.at(i));
  }
  abv += (double)sqrt(usqt);
  usqt = 0;
  for (int i = (0); i < (5); i++) {
    usqt += ((double)c.at(i) - a.at(i)) * ((double)c.at(i) - a.at(i));
  }
  abv *= (double)sqrt(usqt);
  return (acos(dotp / abv));
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.precision(20);
  long long n;
  cin >> n;
  vector<vector<long long>> v;
  for (int i = (0); i < (n); i++) {
    cin >> i1 >> i2 >> i3 >> i4 >> i5;
    vector<long long> vpb{i1, i2, i3, i4, i5};
    v.push_back(vpb);
  }
  long long r = 0;
  vector<long long> rv;
  for (int i = (0); i < (n); i++) {
    for (int j = (0); j < (n); j++) {
      for (int k = (0); k < (n); k++) {
        if (k != j && j != i && i != k) {
          if (eval(v.at(i), v.at(j), v.at(k)) < 3.1415926535897932384626 / 2) {
            j = n;
            k = n;
          }
        }
        if (j == n - 1 && k == n - 1) {
          rv.push_back(i);
          r++;
        }
      }
    }
  }
  cout << r << "\n";
  for (auto it : rv) {
    cout << it + 1 << "\n";
  }
  return 0;
}

```