Gargari is jealous that his friend Caisa won the game from the previous problem. He wants to prove that he is a genius.

He has a n × n chessboard. Each cell of the chessboard has a number written on it. Gargari wants to place two bishops on the chessboard in such a way that there is no cell that is attacked by both of them. Consider a cell with number x written on it, if this cell is attacked by one of the bishops Gargari will get x dollars for it. Tell Gargari, how to place bishops on the chessboard to get maximum amount of money.

We assume a cell is attacked by a bishop, if the cell is located on the same diagonal with the bishop (the cell, where the bishop is, also considered attacked by it).

Input

The first line contains a single integer n (2 ≤ n ≤ 2000). Each of the next n lines contains n integers aij (0 ≤ aij ≤ 109) — description of the chessboard.

Output

On the first line print the maximal number of dollars Gargari will get. On the next line print four integers: x1, y1, x2, y2 (1 ≤ x1, y1, x2, y2 ≤ n), where xi is the number of the row where the i-th bishop should be placed, yi is the number of the column where the i-th bishop should be placed. Consider rows are numbered from 1 to n from top to bottom, and columns are numbered from 1 to n from left to right.

If there are several optimal solutions, you can print any of them.

Examples

Input

4
1 1 1 1
2 1 1 0
1 1 1 0
1 0 0 1


Output

12
2 2 3 2
#include <bits/stdc++.h>
using namespace std;
pair<int, int> fp(int x, int y) {
  int m = min(x, y);
  return {x - m, y - m};
}
pair<int, int> sp(int n, int x, int y) {
  int m = min(n - 1 - x, y);
  return {n - 1 - x - m, y - m};
}
int main() {
  cin.tie(0)->sync_with_stdio(0);
  int n;
  cin >> n;
  int a[n][n];
  vector<vector<int64_t>> f(n, vector<int64_t>(n)), s(n, vector<int64_t>(n));
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < n; ++j) {
      cin >> a[i][j];
      int mi = i - min(i, j);
      int mj = j - min(i, j);
      f[mi][mj] += a[i][j];
      mi = n - 1 - i - min(j, n - 1 - i);
      mj = j - min(j, n - 1 - i);
      s[mi][mj] += a[i][j];
    }
  }
  vector<tuple<int64_t, int, int>> pos;
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < n; ++j) {
      int64_t cur = f[i - min(i, j)][j - min(i, j)] +
                    s[n - 1 - i - min(j, n - 1 - i)][j - min(j, n - 1 - i)];
      cur -= a[i][j];
      pos.emplace_back(cur, i, j);
    }
  }
  sort(pos.rbegin(), pos.rend());
  auto &[v, x, y] = pos[0];
  int i = 1;
  while (1) {
    auto &[nv, nx, ny] = pos[i];
    if (fp(nx, ny) != fp(x, y) && sp(n, nx, ny) != sp(n, x, y) &&
        (abs(nx - x) + abs(ny - y)) % 2) {
      break;
    }
    ++i;
  }
  auto &[nv, nx, ny] = pos[i];
  cout << nv + v << '\n';
  cout << x + 1 << ' ' << y + 1 << ' ' << nx + 1 << ' ' << ny + 1;
}
