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:
//package que_a;

import java.io.*;
import java.util.*;
import java.math.*;

public class utkarsh {

    InputStream is;
    PrintWriter out;
    
    long mod = (long) (1e9 + 7), inf = (long) (3e18);
    
    class point {
        int X, Y, I;
        point(int x, int y, int i) {
            X = x;  Y = y;  I = i;
        }
    }
    
    point a[];
    int x[], y[];
    
    double dist(point u, point v) {
        int x = Math.abs(u.X - v.X);
        int y = Math.abs(u.Y - v.Y);
        return Math.sqrt(1.0 * x * x + 1.0 * y * y);
    }
    
    double[] play(int s, int e) {  //[] -> dist, 1st point, second point
        //System.out.println(s +" "+ e);
        if(e - s < 4) {
            double d[] = new double[3];
            d[0] = dist(a[s], a[s+1]);
            d[1] = a[s].I;  d[2] = a[s+1].I;
            for(int i = s; i < e; i++) {
                for(int j = i+1; j <= e; j++) {
                    double ds = dist(a[i], a[j]);
                    if(ds < d[0]) {
                        d[0] = ds;  d[1] = a[i].I;  d[2] = a[j].I;
                    }
                }
            }
            return d;
        } else {
            int m = (s + e) >> 1;
            double d1[] = play(s, m);
            double d2[] = play(m+1, e);
            double d[];
            if(d1[0] < d2[0])   d = d1;
            else    d = d2;
            int xm = (a[m].X + a[m+1].X) >> 1;
            ArrayList <point> a1 = new ArrayList<>();
            for(int i = m; i >= s; i--) {
                if(xm - a[i].X > d[0])  break;
                a1.add(a[i]);
            }
            ArrayList <point> a2 = new ArrayList<>();
            for(int i = m+1; i <= e; i++) {
                if(a[i].X - xm > d[0])  break;
                a2.add(a[i]);
            }
            Collections.sort(a2, (point u, point v) -> ((u.Y != v.Y) ? (u.Y - v.Y) : (u.X - v.X)));
            int a2z = a2.size();
            for(point p : a1) {
                double y = p.Y - d[0];
                int l = 0, r = a2.size()-1;
                while(l <= r) {
                    int mid = (l + r) >> 1;
                    if(a2.get(mid).Y < y)    l = mid+1;
                    else    r = mid-1;
                }
                y = p.Y + d[0];
                for(int j = l; j < a2z; j++) {
                    point q = a2.get(j);
                    if(q.Y > y)  break;
                    double ds = dist(p, q);
                    if(ds < d[0]) {
                        d[0] = ds;  d[1] = p.I; d[2] = q.I;
                    }
                }
            }
            return d;
        }
    }
    
    void solve() {
        int n = ni();
        x = new int[n];
        y = new int[n];
        a = new point[n];
        for(int i = 0; i < n; i++) {
            x[i] = ni();
            y[i] = ni();
            a[i] = new point(Math.abs(x[i]), Math.abs(y[i]), i);
        }
        Arrays.sort(a, (point u, point v) -> ((u.X != v.X) ? (u.X - v.X) : (u.Y - v.Y)));
        
        //for(point p : a)    System.out.println(p.X +" "+ p.Y +" "+ (p.I+1));
        
        double d[] = play(0, n-1);
        int i = (int)d[1], j = (int)d[2];
        int u = 1, v = 1;
        if(x[i] < 0 && y[i] < 0)    u = 4;
        else if(x[i] < 0)   u = 2;
        else if(y[i] < 0)   u = 3;
        if(x[j] > 0 && y[j] > 0)    v = 4;
        else if(x[j] > 0)   v = 2;
        else if(y[j] > 0)   v = 3;
        out.println((i+1) +" "+ u +" "+ (j+1) +" "+ v);
    }
    
    long mp(long b, long e) {
        long r = 1;
        while(e > 0) {
            if((e&1) == 1)  r = (r * b) % mod;
            b = (b * b) % mod;
            e >>= 1;
        }
        return r;
    }

    //---------- I/O Template ----------
    
    public static void main(String[] args) { new utkarsh().run(); }
    void run() {
        File fi = new File("input.txt");
        File fo = new File("output.txt");
        try{
            is = new FileInputStream(fi);
            out = new PrintWriter(fo);
        } catch (FileNotFoundException e){
            System.out.printf("Error %s\n",e);
        }
        solve();
        out.flush();
    }
    
    byte input[] = new byte[1024];
    int len = 0, ptr = 0;
    
    int readByte() { 
        if(ptr >= len) { ptr = 0; 
            try { len = is.read(input); } 
            catch(IOException e) { throw new InputMismatchException(); } 
            if(len <= 0) { return -1; } 
        } return input[ptr++];
    }
    boolean isSpaceChar(int c) { return !( c >= 33 && c <= 126 ); }
    int skip() { 
        int b = readByte(); 
        while(b != -1 && isSpaceChar(b)) { b = readByte(); } 
        return b;
    }
    
    char nc() { return (char)skip(); }
    String ns() { 
        int b = skip(); 
        StringBuilder sb = new StringBuilder(); 
        while(!isSpaceChar(b)) { sb.appendCodePoint(b); b = readByte(); } 
        return sb.toString();
    }
    String nLine() { 
        int b = skip(); 
        StringBuilder sb = new StringBuilder(); 
        while( !(isSpaceChar(b) && b != ' ') ) { sb.appendCodePoint(b); b = readByte(); } 
        return sb.toString();
    }
    int ni() { 
        int n = 0, b = readByte(); 
        boolean minus = false; 
        while(b != -1 && !( (b >= '0' && b <= '9') || b == '-')) { b = readByte(); } 
        if(b == '-') { minus = true; b = readByte(); } 
        if(b == -1) { return -1; }  //no input 
        while(b >= '0' && b <= '9') { n = n * 10 + (b - '0'); b = readByte(); } 
        return minus ? -n : n;
    }
    long nl() { 
        long n = 0L;    int b = readByte(); 
        boolean minus = false; 
        while(b != -1 && !( (b >= '0' && b <= '9') || b == '-')) { b = readByte(); } 
        if(b == '-') { minus = true; b = readByte(); } 
        while(b >= '0' && b <= '9') { n = n * 10 + (b - '0'); b = readByte(); } 
        return minus ? -n : n;
    }

    double nd() { return Double.parseDouble(ns()); }
    float nf() { return Float.parseFloat(ns()); }
    int[] na(int n) { 
        int a[] = new int[n]; 
        for(int i = 0; i < n; i++) { a[i] = ni(); } 
        return a;
    }
    char[] ns(int n) { 
        char c[] = new char[n]; 
        int i, b = skip(); 
        for(i = 0; i < n; i++) { 
            if(isSpaceChar(b)) { break; } 
            c[i] = (char)b; b = readByte(); 
        } return i == n ? c : Arrays.copyOf(c,i);
    }
}