Problem: You are given a set of n vectors on a plane. For each vector you are allowed to multiply any of its coordinates by -1. Thus, each vector vi = (xi, yi) can be transformed into one of the following four vectors:

  * vi1 = (xi, yi), 
  * vi2 = ( - xi, yi), 
  * vi3 = (xi, - yi), 
  * vi4 = ( - xi, - yi). 



You should find two vectors from the set and determine which of their coordinates should be multiplied by -1 so that the absolute value of the sum of the resulting vectors was minimally possible. More formally, you should choose two vectors vi, vj (1 ≤ i, j ≤ n, i ≠ j) and two numbers k1, k2 (1 ≤ k1, k2 ≤ 4), so that the value of the expression |vik1 + vjk2| were minimum.

Input

The first line contains a single integer n (2 ≤ n ≤ 105). Then n lines contain vectors as pairs of integers "xi yi" ( - 10000 ≤ xi, yi ≤ 10000), one pair per line.

Output

Print on the first line four space-separated numbers "i k1 j k2" — the answer to the problem. If there are several variants the absolute value of whose sums is minimum, you can print any of them. 

Examples

Input

5
-7 -3
9 0
-8 6
7 -8
4 -5


Output

3 2 4 2


Input

5
3 2
-4 7
-6 0
-8 4
5 1


Output

3 4 5 4

Note

A sum of two vectors v = (xv, yv) and u = (xu, yu) is vector s = v + u = (xv + xu, yv + yu).

An absolute value of vector v = (x, y) is number <image>. 

In the second sample there are several valid answers, such as:

(3 1 4 2), (3 1 4 4), (3 4 4 1), (3 4 4 3), (4 1 3 2), (4 1 3 4), (4 2 3 1).

Solution (in JAVA):

Solution:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
import java.util.Arrays;
import java.util.Comparator;


public class J120 {

    static StreamTokenizer st;
    static class Point {
        int x, y, id;
        public Point(int x, int y, int id) {
            this.x = x;
            this.y = y;
            this.id = id;
        }
    }
    static class comp_x implements Comparator<Point> {
        public int compare(Point a, Point b) {
            return a.x==b.x ? a.y-b.y : a.x-b.x;
        }
    }
    static class comp_y implements Comparator<Point> {
        public int compare(Point a, Point b) {
            return a.y-b.y;
        }
    }
    static comp_y cmp_y = new comp_y();
    static Point[]a, t;
    static int res = (int) 1e9;
    static int i1, i2;
    static int[]x,y;
    public static void main(String[] args) throws IOException{
        st = new StreamTokenizer(new BufferedReader(new FileReader("input.txt")));
        PrintWriter pw = new PrintWriter(new FileWriter("output.txt"));
        int n = nextInt();
        a = new Point[n+1];
        x = new int[n+1];
        y = new int[n+1];
        for (int i = 1; i <= n; i++) {
            x[i] = nextInt();
            y[i] = nextInt();
            a[i] = new Point(Math.abs(x[i]), Math.abs(y[i]), i);
        }
        Arrays.sort(a, 1, n+1, new comp_x());
        t = new Point[n+1];
        rec(1, n);
        pw.print(i1+" "+print(Math.abs(x[i1]), Math.abs(y[i1]), i1)+" "+i2+" "+print(-Math.abs(x[i2]), -Math.abs(y[i2]), i2));
        pw.close();
    }
    private static int print(int a, int b, int k) {
        if (x[k]==a && y[k]==b)
            return 1;
        if (-x[k]==a && y[k]==b)
            return 2;
        if (x[k]==a && -y[k]==b)
            return 3;
        return 4;
    }
    private static void rec(int L, int R) {
        if (R-L <= 3) {
            for (int i = L; i <= R; i++) {
                for (int j = i+1; j <= R; j++) {
                    update_ans(a[i], a[j]);
                }
            }
            return;
        }
        int m = (L+R) >> 1;
        int mid_x = a[m].x;
        rec(L, m);
        rec(m+1, R);
        Arrays.sort(a, L, R+1, cmp_y);
        int ts = 0;
        for (int i = L; i <= R; i++) {
            if (Math.abs(a[i].x-mid_x) < res) {
                for (int j = ts-1; j >= 0 && a[i].y-t[j].y< res; j--) {
                    update_ans(a[i], t[j]);
                }
                t[ts++] = a[i];
            }
        }
    }
    private static void update_ans(Point a, Point b) {
        int dis = (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
        if (dis < res) {
            res = dis;
            i1 = a.id;
            i2 = b.id;
        }
    }
    private static int nextInt() throws IOException {
        st.nextToken();
        return (int) st.nval;
    }
}