Cirno gives AquaMoon a problem. There are m people numbered from 0 to m - 1. They are standing on a coordinate axis in points with positive integer coordinates. They are facing right (i.e. in the direction of the coordinate increase). At this moment everyone will start running with the constant speed in the direction of coordinate increasing. The initial coordinate of the i-th person on the line is x_i, and the speed of the i-th person is v_i. So the coordinate of the i-th person at the moment t will be x_i + t ⋅ v_i.

Cirno captured the coordinates of m people in k consecutive integer moments from 0 to k - 1. In every moment, the coordinates of m people were recorded in arbitrary order.

To make the problem more funny, Cirno modified one coordinate at the moment y (0 < y < k-1) to a different integer.

AquaMoon wants to find the moment y and the original coordinate p before the modification. Actually, she is not a programmer at all. So she wasn't able to solve it. Can you help her?

Input

This problem is made as interactive. It means, that your solution will read the input, given by the interactor. But the interactor will give you the full input at the beginning and after that, you should print the answer. So you should solve the problem, like as you solve the usual, non-interactive problem because you won't have any interaction process. The only thing you should not forget is to flush the output buffer, after printing the answer. Otherwise, you can get an "Idleness limit exceeded" verdict. Refer to the [interactive problems guide](https://codeforces.com/blog/entry/45307) for the detailed information about flushing the output buffer.

The first line contains two integers m and k (5 ≤ m ≤ 1000, 7 ≤ k ≤ 1000) — the number of people and the number of recorded moments. 

The next k lines contain captured positions. i-th of these lines contains m integers between 1 and 10^6 (inclusive), representing positions captured by Cirno at the moment i-1.

The input is guaranteed to be valid (i.e. only one integer was modified to a different value according to the problem statement). Also, it is guaranteed, that 1 ≤ v_i ≤ 1000 for all 1 ≤ i ≤ m.

Hack format:

The first line should contain two integers m and k (5 ≤ m ≤ 1000, 7 ≤ k ≤ 1000) — the number of people and the number of moments. 

In the second line, there should be m integers x_0, x_1, ...,x_{m - 1} (1 ≤ x_i ≤ 10^6), where x_i is the initial coordinate of the i-th person.

In the third line, there should be m integers v_0, v_1, ...,v_{m - 1} (1 ≤ v_i ≤ 1000), where v_i is the speed of the i-th person. It should be true that x_i + (k-1) v_i ≤ 10^6 for each 0 ≤ i < m.

In the next k lines, each line should contain m integers. i-th line should contain m distinct integers p_0, p_1, …, p_{m-1} (0 ≤ p_j < m). The meaning of these numbers: j-th integer in the input in the i-th moment is the coordinate of the p_{j}-th person.

In the last line, there should be three integers y, i, c. Cirno modified the coordinate of the i-th person at the moment y to c (1 ≤ y ≤ k-2, 0 ≤ i ≤ m - 1, 1 ≤ c ≤ 10^6, c ≠ x_i + y ⋅ v_i).

Output

Print a single line with two integers y, p — the moment that contains the modified coordinate and the original coordinate.

Example

Input


5 7
6 9 9 6 9
10 7 10 8 10
11 11 11 10 8
12 12 12 12 9
14 13 12 10 13
11 14 16 14 14
12 15 18 15 15


Output


4 13

Note

In the first test the initial coordinates of people are 9, 6, 6, 9, 9 and their speeds are 1, 2, 1, 1, 1. So, it's easy to see, that at the moment 4 one coordinate was modified from 13 to 12.

This is the first test in the hack format:
    
    
      
    5 7  
    9 6 6 9 9  
    1 2 1 1 1  
    2 3 4 1 0  
    0 2 3 1 4  
    4 3 0 1 2  
    1 3 4 0 2  
    1 4 0 2 3  
    2 4 1 3 0  
    2 4 1 3 0  
    4 0 12  
    
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <bitset>
#include <queue>
#include <stack>
#include <sstream>
#include <cstring>
#include <numeric>
#include <ctime>
#include <cassert>
#include <random>
#include <valarray>
//#include <fstream>

#define re return
#define fi first
#define se second
#define mp make_pair
#define pb emplace_back
#define all(x) x.begin(), x.end()
#define sz(x) ((int)(x).size())
#define rep(i, n) for (int i = 0; i < (n); i++)
#define rrep(i, n) for (int i = (n) - 1; i >= 0; i--)
#define y0 y32479
#define y1 y95874
#define next next239
#define prev prev239
#define fill(x, y) memset(x, y, sizeof(x))
#define sqr(x) ((x)*(x))
#define sqrt(x) sqrt(abs(x))
#define unq(x) (x.resize(unique(all(x)) - x.begin()))
#define ba back()
#define popcount __builtin_popcountll
#define fastIO() {ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);}

#ifdef LOCAL_BOBER
bool local = true;
#define deb(x) cout << #x << " = " << (x) << endl
#define debn(x, n) { cout << #x << "(" << n << ") = " << \
	"{"; int _f_ = 1; rep(_i_, n) {if (!_f_) cout << "|"; cout << x[_i_]; _f_= 0;} cout << "}" << endl;}
#define deba(x) { cout << #x << " (size: " << sz(x) << ") = " << \
	"{"; int _f_ = 1; for (auto o : x) {if (!_f_) cout << "|"; cout << o; _f_ = 0;} cout << "}" << endl;}
#else
bool local = false;
#define deb(x) ;
#define debn(x, n) ;
#define deba(x) ;
#define endl "\n"
#endif

using namespace std;

typedef vector<int> vi;
typedef vector<vi> vvi;
typedef pair<int, int> ii;
typedef vector<ii> vii;
typedef vector<string> vs;
typedef long long ll;
typedef pair<ll, ll> pll;
typedef vector<ll> vll;
typedef pair<double, double> pdd;
typedef long double LD;
typedef double D;

template<class T> void print(T v) { cout << sz(v) << endl; for (auto x : v) cout << x << ' '; cout << endl; };
template<class T> void print1(T v) { cout << sz(v) << endl; for (auto x : v) cout << x + 1 << ' '; cout << endl; };
template<class T1, class T2> ostream& operator << (ostream &o, pair<T1, T2> x) {re o << x.fi << ' ' << x.se;}
template<class T1, class T2> istream& operator >> (istream &o, pair<T1, T2> &x) {re o >> x.fi >> x.se;}
template<class T1, class T2> pair<T1, T2> operator + (pair<T1, T2> a, pair<T1, T2> b) {a.fi += b.fi; a.se += b.se; re a;}
template<class T1, class T2> pair<T1, T2> operator - (pair<T1, T2> a, pair<T1, T2> b) {a.fi -= b.fi; a.se -= b.se; re a;}
template<class T1, class T2> void operator += (pair<T1, T2> &a, pair<T1, T2> b) {a.fi += b.fi; a.se += b.se;}
template<class T1, class T2> void operator -= (pair<T1, T2> &a, pair<T1, T2> b) {a.fi -= b.fi; a.se -= b.se;}

int nint() {int x; cin >> x; re x;}
double getTime() { re clock() / (double) CLOCKS_PER_SEC;};

mt19937 rnd(0);
int rand(int n) { re rnd() % n; }
int rand(int l, int r) { re rnd() % (r - l + 1) + l; }

const int mod = 1000000000 + 7;

void initIO() {
	if (local) {
		freopen("input.txt", "r", stdin);
		//freopen("output.txt", "w", stdout);
		srand((int)time(0));
		rnd.seed((int)time(0));
		fastIO();
	}
	else {
		//freopen("input.txt", "r", stdin);
		//freopen("output.txt", "w", stdout);
		fastIO();
	}
}

void solve();

signed main() {
	initIO();

	int tc = 1;
//	cin >> tc;
	rep(tt, tc) {
//		cout << "Case #" << tt + 1 << ": ";
		solve();
	}

	if (local)
		cout << endl << "time = " << getTime() << endl;
}


/* ================ actual code starts here ================ */

int n;
int m;

int pos[1050][1050];
ll sum[1050];
vi so[1050];
int bad;
int diff;
ll dv;

vi v[1050];

int check(int i, int j) {
	int p1 = pos[0][i];
	int p2 = pos[m - 1][j];

	if (p2 < p1 + m - 1)
		re 0;
	if ((p2 - p1) % (m - 1))
		re 0;
	int v = (p2 - p1) / (m - 1);

	rep(i, 20) {
		int p = rand(m);
		if (p == 0 || p == m - 1 || p == bad)
			continue;
		int x = p1 + v * p;
		if (!binary_search(all(so[p]), x))
			re 0;
	}

	re 1;
}

void build() {
	rep(i, n)
	rep(j, n) {
		if (check(i, j))
			v[i].pb(j);
	}
}

int p[1050];
int w[1050];
int ne[1050];
int t;
int vv[1050];

int go(int x) {
	w[x] = t;

	for (int y : v[x])
		if (p[y] == -1) {
			p[y] = x;
			ne[x] = y;
			re 1;
		}

	for (int y : v[x])
		if (w[p[y]] != t && go(p[y])) {
			p[y] = x;
			ne[x] = y;
			re 1;
		}

	re 0;
}

void solve1() {
	rep(i, n)
		shuffle(all(v[i]), rnd);
	vi order(n);
	iota(all(order), 0);
	shuffle(all(order), rnd);

//	rep(i, n)
//		deba(v[i]);
//	exit(0);

	fill(p, -1);
	for (int x : order) {
		t++;
		assert(go(x));
	}

//	rep(i, n) {
//		cout << i << ' ' << p[i] << endl;
//	}
//	exit(0);

	rep(i, n) {
		int p1 = pos[0][i];
		int p2 = pos[m - 1][ne[i]];
		assert((p2 - p1) % (m - 1) == 0);
		vv[i] = (p2 - p1) / (m - 1);
	}
}

int g;

int check() {
	vi u(n);
	rep(i, m) {
		if (i == bad)
			continue;

		rep(j, n)
			u[j] = pos[0][j] + vv[j] * i;
		sort(all(u));
		if (u != so[i])
			re 0;
	}

	multiset<int> ms;
	for (int x : so[bad])
		ms.insert(x);
	rep(i, n) {
		int val = pos[0][i] + vv[i] * bad;
		if (ms.find(val) != ms.end())
			ms.erase(ms.find(val));
		else
			g = val;
	}
	if (sz(ms) != 1)
		re 0;

//	g = *ms.begin();
	re 1;
}

void printAns() {
	cout << bad << ' ' << g << endl;
}

ll getV2(int p1, int p2, int p3) {
	ll sx2 = 0;
//	ll sx = 0;
	ll s1 = 0;
	ll s2 = 0;
	rep(i, n) {
		sx2 += sqr(pos[p1][i]);
//		sx += pos[p1][i];
		s1 += sqr(pos[p2][i]);
		s2 += sqr(pos[p3][i]);
	}

	s1 *= 2;
	s1 -= sx2;
	s2 -= s1;
	assert(s2 % 2 == 0);
	re s2 / 2;
}

void solve() {
	cin >> n >> m;
	vll d;
	rep(i, m) {
		rep(j, n) {
			cin >> pos[i][j];
			so[i].pb(pos[i][j]);
		}
		sum[i] = accumulate(pos[i], pos[i] + n, 0ll);
//		deb(sum[i]);
		sort(all(so[i]));
		if (i)
			d.pb(sum[i] - sum[i - 1]);
	}
	sort(all(d));
	deba(d);
	dv = d[sz(d) / 2];
	for (int i = 1; i < m; i++)
		if (sum[i] - sum[i - 1] != dv) {
			bad = i;
			diff = sum[i] - sum[i - 1] - dv;
			break;
		}

	deb(bad);
	deb(diff);

	ll dv2 = 0;
	if (bad >= 3)
		dv2 = getV2(0, 1, 2);
	else
		dv2 = getV2(bad + 1, bad + 2, bad + 3);

	deb(dv2);

	rep(i, n) {
		pos[bad][i] -= diff;
		ll tmp = getV2(bad - 1, bad, bad + 1);
//		cout << i << ' ' << pos[bad][i] << ' ' << tmp << endl;
		if (tmp == dv2) {
			cout << bad << ' ' << pos[bad][i] << endl;
			re;
		}
		pos[bad][i] += diff;
	}

//	assert(0);


//	deb(check(1, 1));
//	exit(0);

	build();
	while (1) {
		solve1();
		if (!check())
			continue;
		printAns();
		re;
	}
}










