Problem: On the way to school, Karen became fixated on the puzzle game on her phone!

<image>

The game is played as follows. In each level, you have a grid with n rows and m columns. Each cell originally contains the number 0.

One move consists of choosing one row or column, and adding 1 to all of the cells in that row or column.

To win the level, after all the moves, the number in the cell at the i-th row and j-th column should be equal to gi, j.

Karen is stuck on one level, and wants to know a way to beat this level using the minimum number of moves. Please, help her with this task!

Input

The first line of input contains two integers, n and m (1 ≤ n, m ≤ 100), the number of rows and the number of columns in the grid, respectively.

The next n lines each contain m integers. In particular, the j-th integer in the i-th of these rows contains gi, j (0 ≤ gi, j ≤ 500).

Output

If there is an error and it is actually not possible to beat the level, output a single integer -1.

Otherwise, on the first line, output a single integer k, the minimum number of moves necessary to beat the level.

The next k lines should each contain one of the following, describing the moves in the order they must be done:

  * row x, (1 ≤ x ≤ n) describing a move of the form "choose the x-th row". 
  * col x, (1 ≤ x ≤ m) describing a move of the form "choose the x-th column". 



If there are multiple optimal solutions, output any one of them.

Examples

Input

3 5
2 2 2 3 2
0 0 0 1 0
1 1 1 2 1


Output

4
row 1
row 1
col 4
row 3


Input

3 3
0 0 0
0 1 0
0 0 0


Output

-1


Input

3 3
1 1 1
1 1 1
1 1 1


Output

3
row 1
row 2
row 3

Note

In the first test case, Karen has a grid with 3 rows and 5 columns. She can perform the following 4 moves to beat the level:

<image>

In the second test case, Karen has a grid with 3 rows and 3 columns. It is clear that it is impossible to beat the level; performing any move will create three 1s on the grid, but it is required to only have one 1 in the center.

In the third test case, Karen has a grid with 3 rows and 3 columns. She can perform the following 3 moves to beat the level:

<image>

Note that this is not the only solution; another solution, among others, is col 1, col 2, col 3.

Solution (in JAVA):

Solution:

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.InputMismatchException;
import java.util.List;
import java.util.ArrayList;


public class P816C {
  // problem http://codeforces.com/contest/816/problem/C
  InputStream is;
  PrintWriter out;
  String INPUT =  "3 5\n" +
                  "2 2 2 3 2\n" +
                  "0 0 0 1 0\n" +
                  "1 1 1 2 1\n";
        String INPUT3 = 
        "3 3\n" +
        "0 0 0\n" +
        "0 1 0\n" +
        "0 0 0\n" ;

        String INPUT4 = 
"3 3\n" +
"1 1 1\n" +
"1 1 1\n" +
"1 1 1\n"  ;

        String INPUT6 = 
"4 3\n" +
"1 1 1\n" +
"1 1 1\n" +
"1 1 1\n" +
"1 1 1\n"  ;
  

  void solve() {
    int n = ni();
    int m = ni();
    int[][] a = new int[n][m];
    int total = 0;
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < m; j++) {
        a[i][j] = ni();
        total += a[i][j];
      }
      // System.out.println("a[i] = " + Arrays.toString(a[i]));
    }

    List<String> res = new ArrayList<>();
    if (n < m) {
      for (int i = 0; i < n; i++) {
        int max = 100000;
        for (int j = 0; j < m; j++) {
          max = Math.min(max, a[i][j]);
        }
        while (max > 0) {
          res.add("row " + (i + 1));
          max--;
          total -= m;
          for (int j = 0; j < m; j++) {
            a[i][j]--;
          }
        }
      }
      for (int i = 0; i < m; i++) {
        int max = 100000;
        for (int j = 0; j < n; j++) {
          max = Math.min(max, a[j][i]);
        }
        while (max > 0) {
          res.add("col " + (i + 1));
          max--;
          total -= n;
          for (int j = 0; j < n; j++) {
            a[j][i]--;
          }
        }
      } 
    } else {
      for (int i = 0; i < m; i++) {
        int max = 100000;
        for (int j = 0; j < n; j++) {
          max = Math.min(max, a[j][i]);
        }
        while (max > 0) {
          res.add("col " + (i + 1));
          max--;
          total -= n;
          for (int j = 0; j < n; j++) {
            a[j][i]--;
          }
        }
      } 
      for (int i = 0; i < n; i++) {
        int max = 100000;
        for (int j = 0; j < m; j++) {
          max = Math.min(max, a[i][j]);
        }
        while (max > 0) {
          res.add("row " + (i + 1));
          max--;
          total -= m;
          for (int j = 0; j < m; j++) {
            a[i][j]--;
          }
        }
      }
    }
    
    if (total == 0) {
      out.println(res.size());
      for (String cmd : res) {
        out.println(cmd);
      }
    } else {
      System.out.println(-1);
    }
  }
  
  public static void main(String[] args) throws Exception {
    new P816C().run();
  }
  
  void run() throws Exception {
    is = oj ? System.in : new ByteArrayInputStream(INPUT.getBytes());
    out = new PrintWriter(System.out);
  
    long s = System.currentTimeMillis();
    solve();
    out.flush();
    tr(System.currentTimeMillis() - s + "ms");
  }
  
  private byte[] inbuf = new byte[1024];
  private int lenbuf = 0, ptrbuf = 0;
  
  private int readByte() {
    if (lenbuf == -1)
      throw new InputMismatchException();
    if (ptrbuf >= lenbuf) {
      ptrbuf = 0;
      try {
        lenbuf = is.read(inbuf);
      } catch (IOException e) {
        throw new InputMismatchException();
      }
      if (lenbuf <= 0)
        return -1;
    }
    return inbuf[ptrbuf++];
  }
  
  private boolean isSpaceChar(int c) {
    return !(c >= 33 && c <= 126);
  }
  
  private int skip() {
    int b;
    while ((b = readByte()) != -1 && isSpaceChar(b))
      ;
    return b;
  }
  
  private double nd() {
    return Double.parseDouble(ns());
  }
  
  private char nc() {
    return (char) skip();
  }
  
  private String ns() {
    int b = skip();
    StringBuilder sb = new StringBuilder();
    while (!(isSpaceChar(b))) { // when nextLine, (isSpaceChar(b) && b != ' ')
      sb.appendCodePoint(b);
      b = readByte();
    }
    return sb.toString();
  }
  
  private char[] ns(int n) {
    char[] buf = new char[n];
    int b = skip(), p = 0;
    while (p < n && !(isSpaceChar(b))) {
      buf[p++] = (char) b;
      b = readByte();
    }
    return n == p ? buf : Arrays.copyOf(buf, p);
  }
  
  private char[][] nm(int n, int m) {
    char[][] map = new char[n][];
    for (int i = 0; i < n; i++)
      map[i] = ns(m);
    return map;
  }
  
  private int[] na(int n) {
    int[] a = new int[n];
    for (int i = 0; i < n; i++)
      a[i] = ni();
    return a;
  }
  
  private int ni() {
    int num = 0, b;
    boolean minus = false;
    while ((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-'))
      ;
    if (b == '-') {
      minus = true;
      b = readByte();
    }
  
    while (true) {
      if (b >= '0' && b <= '9') {
        num = num * 10 + (b - '0');
      } else {
        return minus ? -num : num;
      }
      b = readByte();
    }
  }
  
  private long nl() {
    long num = 0;
    int b;
    boolean minus = false;
    while ((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-'))
      ;
    if (b == '-') {
      minus = true;
      b = readByte();
    }
  
    while (true) {
      if (b >= '0' && b <= '9') {
        num = num * 10 + (b - '0');
      } else {
        return minus ? -num : num;
      }
      b = readByte();
    }
  }
  
  private boolean oj = System.getProperty("ONLINE_JUDGE") != null;
  
  private void tr(Object... o) {
    if (!oj)
      System.out.println(Arrays.deepToString(o));
  }
}