#include <bits/stdc++.h>   using namespace std;   template <class T>   inline void read(T& x) {     char c;     bool f = 0;     while ((c = getchar()) <  0  ||  9  < c) f |= (c ==  - );     for (x = (c ^ 48);  0  <= (c = getchar()) && c <=  9 ;          x = (x << 1) + (x << 3) + (c ^ 48))       ;     if (f) x = -x;   }   template <class T>   inline T read(const T sample) {     T x = 0;     char c;     bool f = 0;     while ((c = getchar()) <  0  ||  9  < c) f |= (c ==  - );     for (x = (c ^ 48);  0  <= (c = getchar()) && c <=  9 ;          x = (x << 1) + (x << 3) + (c ^ 48))       ;     return f ? -x : x;   }   template <class T>   void fwrit(const T x) {     if (x < 0) return (void)(putchar( - ), fwrit(-x));     if (x > 9) fwrit(x / 10);     putchar(x % 10 ^ 48);   }   template <class T>   inline T Max(const T x, const T y) {     return x > y ? x : y;   }   template <class T>   inline T Min(const T x, const T y) {     return x < y ? x : y;   }   template <class T>   inline T fab(const T x) {     return x > 0 ? x : -x;   }   inline int gcd(const int a, const int b) { return b ? gcd(b, a % b) : a; }   inline void getInv(int inv[], const int lim, const int MOD) {     inv[0] = inv[1] = 1;     for (int i = 2; i <= lim; ++i)       inv[i] = 1ll * inv[MOD % i] * (MOD - MOD / i) % MOD;   }   inline long long mulMod(const long long a, const long long b,                           const long long mod) {     return ((a * b - (long long)((long double)a / mod * b + 1e-8) * mod) % mod +             mod) %            mod;   }   const int MAXN = 100;   const int MAXM = 100;   int n, m, a[MAXN + 5][MAXM + 5];   int x[MAXN + 5], y[MAXN + 5];   vector<int> tx, ty;   inline void Init() {     n = read(1), m = read(1);     for (signed i = (1), i_end_ = (n); i <= i_end_; ++i)       for (signed j = (1), j_end_ = (m); j <= j_end_; ++j) {         a[i][j] = read(1);         x[i] += a[i][j], y[j] += a[i][j];       }     for (signed i = (1), i_end_ = (n); i <= i_end_; ++i)       if (x[i] < 0) tx.push_back(i);     for (signed j = (1), j_end_ = (m); j <= j_end_; ++j)       if (y[j] < 0) ty.push_back(j);   }   bool opx[MAXN + 5], opy[MAXN + 5];   inline void solve() {     int px, py;     while (tx.size() + ty.size() > 0) {       while (!tx.empty()) {         px = tx.back();         tx.pop_back();         x[px] *= -1;         opx[px] ^= 1;         for (signed j = (1), j_end_ = (m); j <= j_end_; ++j) {           y[j] -= a[px][j];           a[px][j] *= -1;           y[j] += a[px][j];         }       }       ty.clear();       for (signed j = (1), j_end_ = (m); j <= j_end_; ++j)         if (y[j] < 0) ty.push_back(j);       while (!ty.empty()) {         py = ty.back();         ty.pop_back();         y[py] *= -1;         opy[py] ^= 1;         for (signed i = (1), i_end_ = (n); i <= i_end_; ++i) {           x[i] -= a[i][py];           a[i][py] *= -1;           x[i] += a[i][py];         }       }       tx.clear();       for (signed i = (1), i_end_ = (n); i <= i_end_; ++i)         if (x[i] < 0) tx.push_back(i);     }   }   inline void writAns() {     int tot = 0;     for (signed i = (1), i_end_ = (n); i <= i_end_; ++i)       if (opx[i]) ++tot;     fwrit(tot);     for (signed i = (1), i_end_ = (n); i <= i_end_; ++i)       if (opx[i]) printf(  %d , i);     putchar(  n );     tot = 0;     for (signed j = (1), j_end_ = (m); j <= j_end_; ++j)       if (opy[j]) ++tot;     fwrit(tot);     for (signed j = (1), j_end_ = (m); j <= j_end_; ++j)       if (opy[j]) printf(  %d , j);     putchar(  n );   }   signed main() {     Init();     solve();     writAns();     return 0;   }