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 java.io.*;
import java.util.*;
import static java.lang.Math.*;

public class BetaRound48_C implements Runnable {

	final boolean ONLINE_JUDGE = System.getProperty("ONLINE_JUDGE") != null;
	BufferedReader in;
	PrintWriter out;
	StringTokenizer tok = new StringTokenizer("");

	void init() throws IOException {
		if (ONLINE_JUDGE) {
			in = new BufferedReader(new InputStreamReader(System.in));
			out = new PrintWriter(System.out);
		} else {
			in = new BufferedReader(new FileReader("input.txt"));
			out = new PrintWriter("output.txt");
		}
	}

	String readString() throws IOException {
		while (!tok.hasMoreTokens()) {
			tok = new StringTokenizer(in.readLine());
		}
		return tok.nextToken();
	}

	int readInt() throws IOException {
		return Integer.parseInt(readString());
	}

	@Override
	public void run() {
		try {
			long t1 = System.currentTimeMillis();
			init();
			solve();
			out.close();
			long t2 = System.currentTimeMillis();
			System.err.println("Time = " + (t2 - t1));
		} catch (Exception e) {
			e.printStackTrace(System.err);
			System.exit(-1);
		}
	}

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

	int[] a;
	int n;
	
	void solve() throws IOException {
		n = readInt();
		TreeSet<Integer> set = new TreeSet<Integer>();
		for (int i = 0; i < n; i++) {
			set.add(readInt()*2);
		}
		n = set.size();
		if (n<=3) {
			out.println(0);
			for (Iterator<Integer> it = set.iterator(); it.hasNext(); ) {
				out.print(it.next()/2.0);
				out.print(" ");
			}
			for (int i = n; i < 3; i++) {
				out.print(1234567);
				out.print(" ");
			}
			return;
		}
		a = new int[n];
		int j = 0;
		for (Iterator<Integer> it = set.iterator(); it.hasNext(); ) {
			a[j++] = it.next();
		}
		Arrays.sort(a);
		
		int left = 1, right = (a[n-1]-a[0])/2+1;
		int m=0;
		while (right - left > 1) {
			m = (left + right) / 2;
			boolean b = search(m);
			if (b) {
				right = m;
			} else {
				left = m;
			}
		}
		
		if (search(left)) m = left;
		else m = right;
		
		//m = (left + right) / 2;
		out.printf(Locale.US, "%.6f\n", m/2.0);
		int k = print(m);
		for (int i = k+1; i < 3; i++) {
			out.printf(Locale.US, "%.6f", 1234567.0);
			if (i!=3) out.print(" ");
		}
	}
	
	boolean search(int d) {
		int x = a[0];
		for (int k = 0; k < 3; k++) {
			x += (2.0*d);
			int index = Arrays.binarySearch(a, x);
			if (index > 0) {
				if (index == n-1) return true;
				x = a[index + 1];
			} else {
				index = -index - 1;
				if (index == n) return true;
				x = a[index];
			}
		}
		return false;
	}
	
	int print(double d) {
		int x = a[0];
		for (int k = 0; k < 3; k++) {
			out.printf(Locale.US, "%.6f", (x+d)/2.0);
			if (k < 2) out.print(" ");
			x += (2.0*d);
			int index = Arrays.binarySearch(a, x);
			if (index > 0) {
				if (index == n-1) return k;
				x = a[index + 1];
			} else {
				index = -index - 1;
				if (index == n) return k;
				x = a[index];
			}
		}
		return 3;
	}
}