#include <bits/stdc++.h>
using namespace std;
void desperate_optimization(int precision) {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cout.setf(ios::fixed);
  cout.setf(ios::showpoint);
  cout.precision(precision);
}
const int N = 100;
int totr[N + 5];
int totc[N + 5];
int arr[N + 5][N + 5];
int markr[N + 5], markc[N + 5];
vector<int> rows, cols;
void hora(int tc) {
  int r, c;
  cin >> r >> c;
  for (int i = 1; i <= r; i++) {
    for (int j = 1; j <= c; j++) {
      cin >> arr[i][j];
      totr[i] += arr[i][j];
      totc[j] += arr[i][j];
    }
  }
  while (1) {
    bool error = 0;
    for (int i = 1; i <= r; i++) {
      if (totr[i] < 0) {
        markr[i] ^= 1;
        totr[i] *= -1;
        for (int j = 1; j <= c; j++) {
          totc[j] -= 2 * arr[i][j];
          arr[i][j] *= -1;
        }
        error = 1;
      }
      if (error == 1) break;
    }
    if (error == 1) continue;
    for (int i = 1; i <= c; i++) {
      if (totc[i] < 0) {
        markc[i] ^= 1;
        totc[i] *= -1;
        for (int j = 1; j <= r; j++) {
          totr[j] -= 2 * arr[j][i];
          arr[j][i] *= -1;
        }
        error = 1;
      }
      if (error == 1) break;
    }
    if (error == 1) continue;
    break;
  }
  for (int i = 1; i <= max(r, c); i++) {
    if (markr[i] == 1) rows.push_back(i);
    if (markc[i] == 1) cols.push_back(i);
  }
  cout << rows.size();
  for (auto x : rows) cout << " " << x;
  cout << '\n';
  cout << cols.size();
  for (auto x : cols) cout << " " << x;
  cout << '\n';
}
int main() {
  desperate_optimization(10);
  int ntc = 1;
  for (int tc = 1; tc <= ntc; tc++) hora(tc);
  return 0;
}
