#include <bits/stdc++.h>
using namespace std;
#define short int32_t
#define int int64_t
#define long __int128_t
const int inf{numeric_limits<int>::max() / 4};
short main() {
#ifndef LOCAL
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
#endif
int n, l;
cin >> n >> l;
vector v(n, vector<int>(l));
for (auto& row : v) {
for (int& val : row) {
cin >> val;
}
}
vector<int> sums(n);
for (int i{0}; i < n; i++) {
for (int j{0}; j < l; j++) {
sums[i] += v[i][j];
}
}
vector<int> order(n);
iota(order.begin(), order.end(), 0);
do {
int pos{0};
int a{0};
int b{1};
vector<int> as(n - 1);
vector<int> bs(n - 1);
bool found{true};
for (int i{0}; i < n; i++) {
int person{order[i]};
int subtracted_a{0};
int old_b{b};
bool ok{false};
while (pos < l) {
if ((b - a) * v[person][pos] * n * old_b >= (sums[person] * old_b - subtracted_a * n) * b) {
ok = true;
break;
}
subtracted_a += (b - a) * v[person][pos] * old_b / b;
a = 0;
b = 1;
pos++;
}
if (!ok) {
found = false;
break;
}
int new_a{sums[person] * old_b - subtracted_a * n};
int new_b{v[person][pos] * n * old_b};
new_a = new_a * b + a * new_b;
new_b *= b;
int g{gcd(new_a, new_b)};
a = new_a / g;
b = new_b / g;
if (i < n - 1) {
as[i] = a + pos * b;
bs[i] = b;
} else if (a > l * b) {
found = false;
break;
}
}
if (found) {
for (int i{0}; i < n - 1; i++) {
cout << as[i] << " " << bs[i] << "\n";
}
vector<int> iorder(n);
for (int i{0}; i < n; i++) {
iorder[order[i]] = i;
}
for (int i : iorder) {
cout << i + 1 << " ";
}
cout << "\n";
return 0;
}
} while (next_permutation(order.begin(), order.end()));
cout << "-1\n";
return 0;
}