import collections
#入力
N = int(input())

dp = [[None]* 101 for _ in range(101)] #101×101の盤面
check = [[None]* 101 for _ in range(101)] #101×101の盤面　重ね合わせた結果に利用
#print (dp)
lst = []
for i in range(N):
    x, y, z = map(int, input().split())
    lst += [[x, y, z]]

#print (lst)
#print (dp)

move = [[-1,0], [1, 0], [0, -1],[0, 1]]
def bfs(x, y, h):
    if h == 0:
        return 0
    dp2 = [[-1]* 101 for _ in range(101)] #101×101の盤面　bfsするときに訪れたかどうかの判定に利用
    dp2[x][y] = h #bfsのスタート地点を記入
    if check[x][y] == None: #重ね合わせた結果が入っていない場合、記録する
        check[x][y] = h
    elif dp2[x][y] != check[x][y]:
        check[x][y] = -10
    #print ('check', check)
    q = collections.deque()
    q.append([x, y]) #スタート地点をqueueに記録
    #print (q)
    while True: #常にループ
        #print ('True') 
        if not q: #dequeが空になっていたら終わる
            #print (q)
            #print ('dp2', dp2)
            return 'B'
        else: #deque内に要素が入っているとき
            px, py = q.popleft() #要素を1組取り出す
            for dx, dy in move:
                nx = px + dx
                ny = py + dy
                if 0 <= nx and nx <101 and 0 <= ny and ny < 101: #範囲内の確認
                    if dp2[nx][ny] == -1: #初めて訪れる時
                        if check[nx][ny] == None: #checkが入っていないとき
                            check[nx][ny] = dp2[px][py] + 1 #移動前のマス+1が移動先の値
                            dp2[nx][ny] = dp2[px][py] + 1 #移動前のマス+1が移動先の値
                            q.append([nx, ny]) #移動先の地点を表す組をdequeに記録
                            #print (check)
                            #print ('C')
                        else: #checkが入っているとき
                            #print ('D')
                            dp2[nx][ny] = dp2[px][py] + 1
                            if dp2[nx][ny] == check[nx][ny]: #今回求めたdp2と記録されているcheckが等しい時
                                #print ('(nx, ny)', nx, ny)
                                pass
                            else: #一致しない時
                                check[nx][ny] = -10
                            q.append([nx, ny])
    return 'A'

def bfs2(x, y, h):
    dp2 = [[-1]* 101 for _ in range(101)] #101×101の盤面　bfsするときに訪れたかどうかの判定に利用
    dp2[x][y] = h #bfsのスタート地点を記入
    if check[x][y] == None: #重ね合わせた結果が入っていない場合、記録する
        check[x][y] = h
    elif dp2[x][y] != check[x][y]:
        check[x][y] = -10
    #print ('check', check)
    q = collections.deque()
    q.append([x, y]) #スタート地点をqueueに記録
    #print (q)
    while True: #常にループ
        #print ('True') 
        if not q: #dequeが空になっていたら終わる
            #print (q)
            #print ('dp2', dp2)
            return 'B'
        else: #deque内に要素が入っているとき
            px, py = q.popleft() #要素を1組取り出す
            for dx, dy in move:
                nx = px + dx
                ny = py + dy
                if 0 <= nx and nx <101 and 0 <= ny and ny < 101: #範囲内の確認
                    if dp2[nx][ny] == -1: #初めて訪れる時
                        if check[nx][ny] == None: #checkが入っていないとき
                            check[nx][ny] = dp2[px][py] + 1 #移動前のマス+1が移動先の値
                            dp2[nx][ny] = dp2[px][py] + 1 #移動前のマス+1が移動先の値
                            q.append([nx, ny]) #移動先の地点を表す組をdequeに記録
                            #print (check)
                            #print ('C')
                        else: #checkが入っているとき
                            #print ('D')
                            dp2[nx][ny] = dp2[px][py] + 1
                            if dp2[nx][ny] == check[nx][ny]: #今回求めたdp2と記録されているcheckが等しい時
                                #print ('(nx, ny)', nx, ny)
                                pass
                            else: #一致しない時
                                check[nx][ny] = -10
                            q.append([nx, ny])
    return 'A'

#print (bfs(59, 3, 0))
#print (bfs(64, 94, 56))
#print (bfs(5, 62, 11))
#print (bfs(3, 93, 14))

for h in range(N):
    a, b, c = lst[h]
    bfs2(a, b, c)
    #print (check)

ans = -1
ans_x = -1
ans_y = -1
for i in range(101):
    for j in range(101):
        if ans < check[i][j]:
            ans = max(ans, check[i][j])
            ans_x, ans_y = i, j

if ans_x != -1 and ans__y != -1:
    print (ans_x, ans_y, ans)
else:
    for h in range(N):
        a, b, c = lst[h]
        bfs(a, b, c)
        for i in range(101):
            for j in range(101):
                if ans < check[i][j]:
                    ans = max(ans, check[i][j])
                    ans_x, ans_y = i, j
    print (ans_x, ans_y, ans)
#print (check)





### FIXED CODE ###

import sys
N = int(input())

lst = []
for i in range(N):
    a = list(map(int, input().split()))
    lst += [a]

#print (lst)

#中心座標(px, py)
for px in range(101):
    for py in range(101):
#        print ('px, py ', px, py)
        j = 0
        while lst[j][2] == 0:
            j += 1
        h = lst[j][2] + abs(px-lst[j][0]) + abs(py -lst[j][1])
#        print ('j, h ', j, h)
        k = 0
        while k < N:
            if lst[k][2] == max(h - abs(px-lst[k][0]) - abs(py -lst[k][1]), 0):
                k += 1
#                print ('A')
            else:
#                print ('B')
                k = 10 ** 9
        if k == N:
            print (px, py, h)
            sys.exit()
        else:
            pass
#            print ('C')