Problem: The New Vasjuki village is stretched along the motorway and that's why every house on it is characterized by its shift relative to some fixed point — the xi coordinate. The village consists of n houses, the i-th house is located in the point with coordinates of xi.

TELE3, a cellular communication provider planned to locate three base stations so as to provide every house in the village with cellular communication. The base station having power d located in the point t provides with communication all the houses on the segment [t - d, t + d] (including boundaries).

To simplify the integration (and simply not to mix anything up) all the three stations are planned to possess the equal power of d. Which minimal value of d is enough to provide all the houses in the village with cellular communication.

Input

The first line contains an integer n (1 ≤ n ≤ 2·105) which represents the number of houses in the village. The second line contains the coordinates of houses — the sequence x1, x2, ..., xn of integer numbers (1 ≤ xi ≤ 109). It is possible that two or more houses are located on one point. The coordinates are given in a arbitrary order.

Output

Print the required minimal power d. In the second line print three numbers — the possible coordinates of the base stations' location. Print the coordinates with 6 digits after the decimal point. The positions of the stations can be any from 0 to 2·109 inclusively. It is accepted for the base stations to have matching coordinates. If there are many solutions, print any of them.

Examples

Input

4
1 2 3 4


Output

0.500000
1.500000 2.500000 3.500000


Input

3
10 20 30


Output

0
10.000000 20.000000 30.000000


Input

5
10003 10004 10001 10002 1


Output

0.500000
1.000000 10001.500000 10003.500000

Solution (in JAVA):

Solution:
import sun.print.PSPrinterJob;

import java.io.*;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.StringTokenizer;

public class C implements Runnable {

    // leave empty to read from stdin/stdout
    private static final String TASK_NAME_FOR_IO = "";

    // file names
    private static final String FILE_IN = TASK_NAME_FOR_IO + ".in";
    private static final String FILE_OUT = TASK_NAME_FOR_IO + ".out";

    BufferedReader in;
    PrintWriter out;
    StringTokenizer tokenizer = new StringTokenizer("");

    public static void main(String[] args) {
        new Thread(new C()).start();
    }

    int n;
    double[] a;
    double EPS = 1e-11;

    private void solve() throws IOException {
        n = nextInt();
        a = new double[n];
        for (int i = 0; i < n; i++) {
            a[i] = nextInt();
        }
        Arrays.sort(a);

        double lo = 0.0;
        double hi = 1e10;
        double lastCan = Double.POSITIVE_INFINITY;
        for (int i = 0; i < 128; i++) {
            double mid = (lo + hi) * 0.5;
            if (can(mid)) {
                hi = mid;
                lastCan = mid;
            } else {
                lo = mid;
            }
        }

        out.printf("%.6f", lastCan);
        out.println();

        print = true;
        can(lastCan);
    }

    boolean print = false;
    List<Double> coords = new ArrayList<Double>();

    private boolean can(double d) {
        int last = 0;
        for (int k = 0; k < 3; k++) {
            int i = last;
            double towerHi = a[i] + 2.0 * d;
            while (i < n && a[i] < towerHi + EPS) {
                i++;
            }

            if (print) {
                coords.add(towerHi - d);
            }

            last = i;
            if (last >= n) {
                break;
            }

        }

        if (print) {
            while (coords.size() < 3) {
                coords.add(coords.get(coords.size() - 1));
            }

            boolean first = true;
            for (double v : coords) {
                if (!first) {
                    out.print(' ');
                }
                out.printf("%.6f", v);
                first = false;
            }


        }

        return last >= n;
    }

    public void run() {
        long timeStart = System.currentTimeMillis();
        try {

            if (TASK_NAME_FOR_IO.length() > 0) {
                in = new BufferedReader(new FileReader(FILE_IN));
                out = new PrintWriter(new FileWriter(FILE_OUT));
            } else {
                in = new BufferedReader(new InputStreamReader(System.in));
                out = new PrintWriter(new OutputStreamWriter(System.out));
            }

            solve();

            in.close();
            out.close();
        } catch (IOException e) {
            throw new IllegalStateException(e);
        }
        long timeEnd = System.currentTimeMillis();
        System.out.println("Time spent: " + (timeEnd - timeStart) + " ms");
    }

    private String nextToken() throws IOException {
        while (!tokenizer.hasMoreTokens()) {
            String line = in.readLine();
            if (line == null) {
                return null;
            }
            tokenizer = new StringTokenizer(line);
        }
        return tokenizer.nextToken();
    }

    private int nextInt() throws IOException {
        return Integer.parseInt(nextToken());
    }

    private BigInteger nextBigInt() throws IOException {
        return new BigInteger(nextToken());
    }

    private long nextLong() throws IOException {
        return Long.parseLong(nextToken());
    }

    private double nextDouble() throws IOException {
        return Double.parseDouble(nextToken());
    }

}