#include <bits/stdc++.h>
using namespace std;
template <class T>
void PV(T x) {
  for (__typeof__((x).begin()) i = (x).begin(); i != (x).end(); ++i)
    cout << *i << " ";
  cout << endl;
}
int main(int argc, char *argv[]) {
  int n, m;
  cin >> n >> m;
  int a[n][m];
  for (int n_ = (n), i = 0; i < n_; ++i)
    for (int n_ = (m), j = 0; j < n_; ++j) cin >> a[i][j];
  vector<int> r(n, 0);
  for (int n_ = (n), i = 0; i < n_; ++i)
    for (int n_ = (m), j = 0; j < n_; ++j) r[i] += a[i][j];
  vector<int> c(m, 0);
  for (int n_ = (n), i = 0; i < n_; ++i)
    for (int n_ = (m), j = 0; j < n_; ++j) c[j] += a[i][j];
  queue<int> q;
  vector<int> ans(n + m, 0);
  for (int n_ = (n), i = 0; i < n_; ++i)
    if (r[i] < 0) q.push(i);
  for (int n_ = (m), i = 0; i < n_; ++i)
    if (c[i] < 0) q.push(n + i);
  for (; !q.empty(); q.pop()) {
    int now = q.front();
    if (now < n && r[now] < 0) {
      ans[now] ^= 1;
      for (int n_ = (m), j = 0; j < n_; ++j) {
        c[j] -= a[now][j] + a[now][j];
        if (c[j] < 0) q.push(n + j);
      }
      for (int n_ = (m), j = 0; j < n_; ++j) a[now][j] = -a[now][j];
      r[now] = -r[now];
    } else if (now >= n && c[now - n] < 0) {
      ans[now] ^= 1;
      now -= n;
      for (int n_ = (n), i = 0; i < n_; ++i) {
        r[i] -= a[i][now] + a[i][now];
        if (r[i] < 0) q.push(i);
      }
      for (int n_ = (n), i = 0; i < n_; ++i) a[i][now] = -a[i][now];
      c[now] = -c[now];
    }
  }
  vector<int> ansr, ansc;
  for (int n_ = (n), i = 0; i < n_; ++i)
    if (ans[i]) ansr.push_back(i + 1);
  for (int n_ = (m), i = 0; i < n_; ++i)
    if (ans[n + i]) ansc.push_back(i + 1);
  cout << ansr.size() << " ";
  PV(ansr);
  cout << ansc.size() << " ";
  PV(ansc);
  return 0;
}
