import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Locale;
import java.util.StringTokenizer;

public class hadron_sm {

	class Circle {
		double x, y, r;

		public Circle(double x, double y, double r) {
			this.x = x;
			this.y = y;
			this.r = r;
		}

		double dist(Circle c) {
			return Math.hypot(x - c.x, y - c.y);
		}
	}

	class Point {
		double x, y;

		public Point(double x, double y) {
			this.x = x;
			this.y = y;
		}

		double dist(Circle c) {
			return Math.hypot(x - c.x, y - c.y);
		}
	}

	class Line {
		double a, b, c;
		Point p;

		public Line(Circle c1, Circle c2) {
			double d = c1.dist(c2);
			double tx = (c2.r * c2.r - c1.r * c1.r + d * d) / (2 * d);
			double ty = -(c2.r * c2.r - c1.r * c1.r - d * d) / (2 * d);
			double x = c1.x + (c2.x - c1.x) / d * tx;
			double y = c2.y + -(c2.y - c1.y) / d * ty;
			p = new Point(x, y);
			a = c2.x - c1.x;
			b = c2.y - c1.y;
			c = -a * x - b * y;
		}

		Point cross(Line l) {
			double x = (c * l.b - b * l.c) / (b * l.a - a * l.b);
			double y = -(c * l.a - a * l.c) / (b * l.a - a * l.b);
			return new Point(x, y);
		}

		@Override
		public String toString() {
			return a + " " + b + " " + c + "(" + p.x + " " + p.y + ")";
		}
	}

	void solve() {
		int n = nextInt();
		Circle[] c = new Circle[n];
		for (int i = 0; i < c.length; i++) {
			c[i] = new Circle(nextInt(), nextInt(), nextInt());
		}
		if (n == 1) {
			out.printf(Locale.US, "%.10f %.10f %.10f\n", c[0].x + 2000,
					c[0].y + 2000, Math.hypot(new Point(c[0].x + 2000,
							c[0].y + 2000).dist(c[0]), c[0].r));
		} else if (n == 2) {
			Line l1 = new Line(c[0], c[1]);
			// System.err.println(l1);
			out.printf(Locale.US, "%.10f %.10f %.10f\n", l1.p.x, l1.p.y, Math
					.hypot(l1.p.dist(c[0]), c[0].r));
			// out.println((l1.p.x - 10 * l1.b) + " " + (l1.p.y + 10 * l1.a) +
			// " "
			// + (l1.p.x + 10 * l1.b) + " " + (l1.p.y - 10 * l1.a));

		} else {
			Line l1 = new Line(c[0], c[1]);
			Line l2 = new Line(c[1], c[2]);
			System.err.println(l1);
			System.err.println(l2);
			Point p = l1.cross(l2);
			// System.err.println(p.x + " " + p.y);
			out.printf(Locale.US, "%.10f %.10f %.10f\n", p.x, p.y, Math.hypot(p
					.dist(c[1]), c[1].r));
			// out.println((l1.p.x - 10 * l1.b) + " " + (l1.p.y + 10 * l1.a) +
			// " "
			// + (l1.p.x + 10 * l1.b) + " " + (l1.p.y - 10 * l1.a));
			// out.println((l2.p.x - 10 * l2.b) + " " + (l2.p.y + 10 * l2.a) +
			// " "
			// + (l2.p.x + 10 * l2.b) + " " + (l2.p.y - 10 * l2.a));
		}

	}

	BufferedReader br;
	PrintWriter out;
	StringTokenizer st;

	void run() {
		try {
			br = new BufferedReader(new FileReader("hadron.in"));
			out = new PrintWriter(new FileWriter("hadron.out"));
			solve();
			out.close();
		} catch (IOException e) {
			e.printStackTrace();
			System.exit(1);
		}
	}

	String nextToken() {
		try {
			while (st == null || !st.hasMoreTokens()) {
				st = new StringTokenizer(br.readLine());
			}
			return st.nextToken();
		} catch (Exception e) {
			return "0";
		}
	}

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

	public static void main(String[] args) {
		new hadron_sm().run();
	}
}
