Problem:
Score: 300 points

Problem Statement

In the Ancient Kingdom of Snuke, there was a pyramid to strengthen the authority of Takahashi, the president of AtCoder Inc.

The pyramid had center coordinates (C_X, C_Y) and height H. The altitude of coordinates (X, Y) is max(H - |X - C_X| - |Y - C_Y|, 0).

Aoki, an explorer, conducted a survey to identify the center coordinates and height of this pyramid. As a result, he obtained the following information:

C_X, C_Y was integers between 0 and 100 (inclusive), and H was an integer not less than 1.

Additionally, he obtained N pieces of information. The i-th of them is: "the altitude of point (x_i, y_i) is h_i."

This was enough to identify the center coordinates and the height of the pyramid. Find these values with the clues above.

Constraints

N is an integer between 1 and 100 (inclusive).

x_i and y_i are integers between 0 and 100 (inclusive).

h_i is an integer between 0 and 10^9 (inclusive).

The N coordinates (x_1, y_1), (x_2, y_2), (x_3, y_3), ..., (x_N, y_N) are all different.

The center coordinates and the height of the pyramid can be uniquely identified.

Input

Input is given from Standard Input in the following format:

N
x_1 y_1 h_1
x_2 y_2 h_2
x_3 y_3 h_3
:
x_N y_N h_N

Output

Print values C_X, C_Y and H representing the center coordinates and the height of the pyramid in one line, with spaces in between.

Sample Input 1

4
2 3 5
2 1 5
1 2 5
3 2 5

Sample Output 1

2 2 6

In this case, the center coordinates and the height can be identified as (2, 2) and 6.

Sample Input 2

2
0 0 100
1 1 98

Sample Output 2

0 0 100

In this case, the center coordinates and the height can be identified as (0, 0) and 100.

Note that C_X and C_Y are known to be integers between 0 and 100.

Sample Input 3

3
99 1 191
100 1 192
99 0 192

Sample Output 3

100 0 193

In this case, the center coordinates and the height can be identified as (100, 0) and 193.

Solution in Go (1.6) (judge verdict: Wrong Answer)

package main

import (
	"bufio"
	"fmt"
	"math"
	"os"
	"strconv"
)

type Num struct {
	X int
	Y int
	H int
}

func main() {
	s := IOInitialize()
	s.Buffer([]byte{}, math.MaxInt64)
	N := Int(s)
	nums := scanNums(s, N)
	resX := 0
	resY := 0
	resH := 0
	hasRes := false
	minH := 10000000000
	for _, num := range nums {
		if num.H < minH {
			minH = num.H
		}
	}
	for cy := 0; cy < 101; cy++ {
		for cx := 0; cx < 101; cx++ {
			for h := minH; h < minH+203; h++ {
				for i, num := range nums {
					if h-abs(num.X-cx)-abs(num.Y-cy) == num.H {
						/*
							fmt.Println("hoge")
							fmt.Println(i)
							fmt.Println(num.X, cx, num.Y, cy, num.H, minH)
							fmt.Println(len(nums))
						*/
						if i == len(nums)-1 {
							//fmt.Println("fuga")
							hasRes = true
							resX = cx
							resY = cy
							resH = abs(num.X-cx) + abs(num.Y-cy) + num.H
						}
					} else {
						break
					}
				}
				if hasRes {
					break
				}
			}
		}

		if hasRes {
			break
		}
	}
	fmt.Println(resX, resY, resH)
	//cx := 0
	//cy := 0
	/*
		for _, num := range nums {
			sumX += num.X
			sumY += num.Y
		}
		l := len(nums)
		cX := sumX / l
		cY := sumY / l
		num := nums[0]
		x0 := num.X
		y0 := num.Y
		h0 := num.H
		cH := abs(x0-cX) + abs(y0-cY) + h0
		fmt.Println(cX)
		fmt.Println(cY)
		fmt.Println(cH)
	*/
}

/*
func isOK(cX int, cY int, nums []Nums) bool {

}
*/

func abs(a int) int {
	return int(math.Abs(float64(a)))
}

func IOInitialize() *bufio.Scanner {
	s := bufio.NewScanner(os.Stdin)
	s.Split(bufio.ScanWords)
	return s
}

func Int(s *bufio.Scanner) int {
	if !s.Scan() {
		panic("scan error")
	}

	value, err := strconv.Atoi(s.Text())
	if err != nil {
		panic("text to int error")
	}
	return value
}

func String(s *bufio.Scanner) string {
	if !s.Scan() {
		panic("scan error")
	}

	return s.Text()
}

func scanNums(s *bufio.Scanner, len int) (nums []Num) {
	for i := 0; i < len; i++ {
		x := Int(s)
		y := Int(s)
		h := Int(s)
		nums = append(nums, Num{X: x, Y: y, H: h})
	}
	return
}

func scanstrings(s *bufio.Scanner, len int) (strs []string) {
	for i := 0; i < len; i++ {
		str := String(s)
		strs = append(strs, str)
	}
	return
}