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.
import java.io.*;
import java.math.*;
import java.util.*;
public class Main{

  public static long sq(long a){
    return a*a;
  }
  public static long distSq(long ax, long ay, long bx, long by){
    return sq(ax-bx)+sq(ay-by);
  }
  
  public static class Point{
    long x1;
    long x2;
    long x3;
    long x4;
    long x5;
    
    public Point(long x1, long x2, long x3, long x4, long x5){
      this.x1 = x1;
      this.x2 = x2;
      this.x3 = x3;
      this.x4 = x4;
      this.x5 = x5;
    }
    
    private static long sq(long x){
      return x*x;
    }
    public long lenSq(){
      return sq(x1)+sq(x2)+sq(x3)+sq(x4)+sq(x5);
    }
    
    public long prod(Point other){
      return this.x1*other.x1 + this.x2*other.x2 + this.x3*other.x3 + this.x4*other.x4 + this.x5*other.x5;
    }
    
    public Point sub(Point other){
      return new Point(this.x1-other.x1,this.x2-other.x2,this.x3-other.x3,this.x4-other.x4,this.x5-other.x5);
    }
    
  }
   
   
  public static boolean check(ArrayList<Point> points, int i){
    Point ith = points.get(i);
    int n = points.size();
    for(int j=0; j<n; ++j){
      if(j == i){
        continue;
      }
      for(int k=0; k<n; k++){
        if(k == i || k == j){
            continue;
        }
        
        Point x = points.get(j).sub(ith);
        Point y = points.get(k).sub(ith);
        if(x.prod(y) > 0){
          return false;
        }
      }
    }
    return true;
  }
  
  public static void main(String[] args){
    InputReader reader = new InputReader(System.in);
    PrintWriter pw = new PrintWriter(System.out);
    int n = reader.nextInt();
    if(n > 11){
      pw.printf("0\n");
      pw.flush();
      pw.close();
      return;
    }
    ArrayList<Point> points = new ArrayList<Point>(n);
    for(int i=0; i<n; ++i){
      points.add(new Point(reader.nextLong(), reader.nextLong(), reader.nextLong(), reader.nextLong(), reader.nextLong()));
    }
    
    ArrayList<Integer> ret = new ArrayList<Integer>(11);
    for(int i=0; i<n; ++i){
      if(check(points,i)){
        ret.add(i+1);
      }
    }
    
    pw.printf("%d\n", ret.size());
    for(Integer x : ret){
      pw.printf("%d\n", x);
    }
    pw.flush();
    pw.close();
  }
  
  public static class InputReader {
    BufferedReader reader;
    StringTokenizer tokenizer;
    
    public InputReader (InputStream stream){
      reader = new BufferedReader(new InputStreamReader(stream));
    }
    
    public String next(){
      while(tokenizer == null || !tokenizer.hasMoreTokens()){
        try{
          String line = reader.readLine();
          if(line == null){
            return "0";
          }
          tokenizer = new StringTokenizer(line);
        } catch(IOException ioe){
          throw new RuntimeException(ioe);
        }
      }
      return tokenizer.nextToken();
    }
    
    public int nextInt(){
      return Integer.parseInt(next());
    }
    
    public double nextDouble(){
      return Double.parseDouble(next());
    }
    
    public Long nextLong(){
      return Long.parseLong(next());
    }
    
    public BigInteger nextBigInteger(){
      return new BigInteger(next());
    }
    
    public String nextLine(){
      String line = "";
      try{
        while(line.equals("")){
          line = reader.readLine();
        }
      } catch(IOException ioe){
        throw new RuntimeException(ioe);
      }
      return line;
    }
  }
  
}