#include <bits/stdc++.h>
using namespace std;
template <class C>
void mini(C &a4, C b4) {
  a4 = min(a4, b4);
}
template <class C>
void maxi(C &a4, C b4) {
  a4 = max(a4, b4);
}
template <class TH>
void _dbg(const char *sdbg, TH h) {
  cerr << sdbg << "=" << h << "\n";
}
template <class TH, class... TA>
void _dbg(const char *sdbg, TH h, TA... a) {
  while (*sdbg != ',') cerr << *sdbg++;
  cerr << "=" << h << ",";
  _dbg(sdbg + 1, a...);
}
template <class T>
ostream &operator<<(ostream &os, vector<T> V) {
  os << "[";
  for (auto vv : V) os << vv << ",";
  return os << "]";
}
template <class L, class R>
ostream &operator<<(ostream &os, pair<L, R> P) {
  return os << "(" << P.first << "," << P.second << ")";
}
const long long MaxN = 1024;
const long long D = 5;
long long pts[MaxN][D];
bool isAcute(long long A, long long B, long long C) {
  long long dot = 0;
  for (long long i = 0; i < D; i++) {
    dot += (pts[A][i] - pts[B][i]) * (pts[C][i] - pts[B][i]);
  }
  (A, B, C, dot);
  return dot > 0;
}
long long N;
int32_t main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout << fixed << setprecision(11);
  if (0) cout << fixed << setprecision(6);
  cin >> N;
  for (long long i = 0; i < N; i++) {
    for (long long j = 0; j < D; j++) {
      cin >> pts[i][j];
    }
  }
  if (N == 1) {
    cout << "1\n1\n";
    return 0;
  }
  long long x = 0, y = 1;
  for (long long i = 2; i < N; i++) {
    if (isAcute(x, y, i)) {
      y = i;
    } else if (isAcute(y, x, i)) {
      x = i;
    }
  }
  vector<long long> sols;
  for (long long chk : {x, y}) {
    bool fail = false;
    for (long long i = 0; i < N; i++) {
      for (long long j = i + 1; j < N; j++) {
        if (i == chk || j == chk) {
          continue;
        }
        if (isAcute(i, chk, j)) {
          fail = true;
          break;
        }
      }
    }
    if (!fail) {
      sols.push_back(chk);
    }
  }
  cout << sols.size() << "\n";
  for (long long v : sols) {
    cout << v + 1 << "\n";
  }
}

### Prompt

Your task is to create 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;
template <class C>
void mini(C &a4, C b4) {
  a4 = min(a4, b4);
}
template <class C>
void maxi(C &a4, C b4) {
  a4 = max(a4, b4);
}
template <class TH>
void _dbg(const char *sdbg, TH h) {
  cerr << sdbg << "=" << h << "\n";
}
template <class TH, class... TA>
void _dbg(const char *sdbg, TH h, TA... a) {
  while (*sdbg != ',') cerr << *sdbg++;
  cerr << "=" << h << ",";
  _dbg(sdbg + 1, a...);
}
template <class T>
ostream &operator<<(ostream &os, vector<T> V) {
  os << "[";
  for (auto vv : V) os << vv << ",";
  return os << "]";
}
template <class L, class R>
ostream &operator<<(ostream &os, pair<L, R> P) {
  return os << "(" << P.first << "," << P.second << ")";
}
const long long MaxN = 1024;
const long long D = 5;
long long pts[MaxN][D];
bool isAcute(long long A, long long B, long long C) {
  long long dot = 0;
  for (long long i = 0; i < D; i++) {
    dot += (pts[A][i] - pts[B][i]) * (pts[C][i] - pts[B][i]);
  }
  (A, B, C, dot);
  return dot > 0;
}
long long N;
int32_t main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout << fixed << setprecision(11);
  if (0) cout << fixed << setprecision(6);
  cin >> N;
  for (long long i = 0; i < N; i++) {
    for (long long j = 0; j < D; j++) {
      cin >> pts[i][j];
    }
  }
  if (N == 1) {
    cout << "1\n1\n";
    return 0;
  }
  long long x = 0, y = 1;
  for (long long i = 2; i < N; i++) {
    if (isAcute(x, y, i)) {
      y = i;
    } else if (isAcute(y, x, i)) {
      x = i;
    }
  }
  vector<long long> sols;
  for (long long chk : {x, y}) {
    bool fail = false;
    for (long long i = 0; i < N; i++) {
      for (long long j = i + 1; j < N; j++) {
        if (i == chk || j == chk) {
          continue;
        }
        if (isAcute(i, chk, j)) {
          fail = true;
          break;
        }
      }
    }
    if (!fail) {
      sols.push_back(chk);
    }
  }
  cout << sols.size() << "\n";
  for (long long v : sols) {
    cout << v + 1 << "\n";
  }
}

```