"use strict";

function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }

function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }

function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }

function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }

function main(input) {
  var lines = input.split('\n'); // read all data first.

  var N = parseInt(lines.shift());
  var data = [];
  var _iteratorNormalCompletion = true;
  var _didIteratorError = false;
  var _iteratorError = undefined;

  try {
    for (var _iterator = lines[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
      var line = _step.value;

      var _splitNum = splitNum(line),
          _splitNum2 = _slicedToArray(_splitNum, 3),
          x = _splitNum2[0],
          y = _splitNum2[1],
          h = _splitNum2[2];

      data.push({
        x,
        y,
        h
      });
    } // check for all possible (Cx, Cy).

  } catch (err) {
    _didIteratorError = true;
    _iteratorError = err;
  } finally {
    try {
      if (!_iteratorNormalCompletion && _iterator.return != null) {
        _iterator.return();
      }
    } finally {
      if (_didIteratorError) {
        throw _iteratorError;
      }
    }
  }

  for (var cx = 0; cx <= 100; cx++) {
    check: for (var cy = 0; cy <= 100; cy++) {
      var ph = null;

      for (var _i = 0; _i < data.length; _i++) {
        var _data$_i = data[_i],
            x = _data$_i.x,
            y = _data$_i.y,
            h = _data$_i.h;
        // distance from the center.
        var d = Math.abs(x - cx) + Math.abs(y - cy);

        if (h >= 1) {
          // if not saturated...
          var phc = h + d;

          if (ph == null) {
            ph = phc;
          } else if (ph !== phc) {
            // conflict
            continue check;
          }
        }
      } // check for other data.


      for (var _i2 = 0; _i2 < data.length; _i2++) {
        var _data$_i2 = data[_i2],
            x = _data$_i2.x,
            y = _data$_i2.y,
            h = _data$_i2.h;

        var _d = Math.abs(x - cx) + Math.abs(y - cy);

        if (h === 0) {
          if (ph - _d > 0) {
            // conflict
            continue check;
          }
        }
      } // complete!


      console.log(`${cx} ${cy} ${ph}`);
      return;
    }
  }
}

main(require('fs').readFileSync('/dev/stdin', 'utf8'));

function splitNum(line) {
  return line.split(/\s+/).map(function (n) {
    return parseInt(n);
  });
}
