#include <bits/stdc++.h>
using namespace std;
vector<vector<long long> > mul(vector<vector<long long> > a,
                               vector<vector<long long> > b) {
  vector<vector<long long> > c;
  c.resize(a.size());
  for (int i = 0; i < c.size(); i++) c[i].resize(b[0].size(), 0);
  for (int i = 0; i < c.size(); i++)
    for (int j = 0; j < c[i].size(); j++)
      for (int k = 0; k < b.size(); k++)
        c[i][j] = (c[i][j] + a[i][k] * b[k][j]);
  return c;
}
vector<vector<long long> > Def;
vector<vector<long long> > bpow(vector<vector<long long> > a, long long st) {
  if (st == 0) return Def;
  if (st == 1) return a;
  vector<vector<long long> > b = bpow(a, st >> 1);
  b = mul(b, b);
  if (st & 1) b = mul(a, b);
  return b;
}
long long AR = 19, BR = 13, CR = 23, XR = 228, YR = 322, MOD = 1e9 + 993;
long long myrand() {
  long long ZR = (XR * AR + YR * BR + CR) % MOD;
  XR = YR;
  YR = ZR;
  return ZR;
}
long long sqr(long long x) { return x * x; }
const long long llinf = 2e18;
const long double EPS = 1e-9;
const long double PI = atan2(0, -1);
const int maxn = 2e5 + 100, inf = 1e9 + 100, mod = 1e9 + 7, sq = 100;
int q[maxn][5];
int n;
bool check(int x, int v, int u) {
  int ret = 0;
  for (int i = 0; i < 5; i++) ret += (q[v][i] - q[x][i]) * (q[u][i] - q[x][i]);
  return ret <= 0;
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < 5; j++) cin >> q[i][j];
  }
  for (int i = 0; i < 5; i++) q[n][i] = q[0][i];
  for (int i = 0; i < 5; i++) q[n + 1][i] = q[1][i];
  if (n < 3) {
    cout << n << '\n';
    for (int i = 0; i < n; i++) cout << i + 1 << ' ';
    return 0;
  }
  int good = 0;
  for (int i = 1; i < n; i += 2) {
    int v = i, u = i + 1;
    int nw = good;
    if (check(v, u, good)) nw = v;
    if (check(u, v, good)) nw = u;
    good = nw;
  }
  if (good >= n) good -= n;
  for (int i = 0; i < n; i++)
    for (int j = i + 1; j < n; j++)
      if (i != good && j != good)
        if (!check(good, i, j)) {
          good = -1;
          break;
        }
  if (good == -1)
    cout << 0;
  else
    cout << 1 << '\n' << good + 1;
}

### 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;
vector<vector<long long> > mul(vector<vector<long long> > a,
                               vector<vector<long long> > b) {
  vector<vector<long long> > c;
  c.resize(a.size());
  for (int i = 0; i < c.size(); i++) c[i].resize(b[0].size(), 0);
  for (int i = 0; i < c.size(); i++)
    for (int j = 0; j < c[i].size(); j++)
      for (int k = 0; k < b.size(); k++)
        c[i][j] = (c[i][j] + a[i][k] * b[k][j]);
  return c;
}
vector<vector<long long> > Def;
vector<vector<long long> > bpow(vector<vector<long long> > a, long long st) {
  if (st == 0) return Def;
  if (st == 1) return a;
  vector<vector<long long> > b = bpow(a, st >> 1);
  b = mul(b, b);
  if (st & 1) b = mul(a, b);
  return b;
}
long long AR = 19, BR = 13, CR = 23, XR = 228, YR = 322, MOD = 1e9 + 993;
long long myrand() {
  long long ZR = (XR * AR + YR * BR + CR) % MOD;
  XR = YR;
  YR = ZR;
  return ZR;
}
long long sqr(long long x) { return x * x; }
const long long llinf = 2e18;
const long double EPS = 1e-9;
const long double PI = atan2(0, -1);
const int maxn = 2e5 + 100, inf = 1e9 + 100, mod = 1e9 + 7, sq = 100;
int q[maxn][5];
int n;
bool check(int x, int v, int u) {
  int ret = 0;
  for (int i = 0; i < 5; i++) ret += (q[v][i] - q[x][i]) * (q[u][i] - q[x][i]);
  return ret <= 0;
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < 5; j++) cin >> q[i][j];
  }
  for (int i = 0; i < 5; i++) q[n][i] = q[0][i];
  for (int i = 0; i < 5; i++) q[n + 1][i] = q[1][i];
  if (n < 3) {
    cout << n << '\n';
    for (int i = 0; i < n; i++) cout << i + 1 << ' ';
    return 0;
  }
  int good = 0;
  for (int i = 1; i < n; i += 2) {
    int v = i, u = i + 1;
    int nw = good;
    if (check(v, u, good)) nw = v;
    if (check(u, v, good)) nw = u;
    good = nw;
  }
  if (good >= n) good -= n;
  for (int i = 0; i < n; i++)
    for (int j = i + 1; j < n; j++)
      if (i != good && j != good)
        if (!check(good, i, j)) {
          good = -1;
          break;
        }
  if (good == -1)
    cout << 0;
  else
    cout << 1 << '\n' << good + 1;
}

```