using System; using System.Collections.Generic; using System.Linq; public class Solver { static List Solve(int n, int k, int[,] a, int[,] b) { var ops = new List(); Search(b, k, a, ops); ops.Reverse(); var ans = new List(); var s = (int[,])a.Clone(); foreach (var op in ops) { List p; if (op < n) { p = SelectCol(s, op); ReorderColsByColPerm(s, op); } else { p = SelectRow(s, op-n); ReorderRowsByRowPerm(s, op-n); } var z = op%n; var tmp = new List(); for (var cnt = cycle(p)-1; cnt > 0; cnt--) { z = p[z]; tmp.Add(op < n ? z : (z+n)); } ans = tmp.Concat(ans).ToList(); } return ans; } static bool Search(int[,] b, int k, int[,] t, List v) { if (k == 0) { return IsSame(b, t); } for (var i = 0; i <= b.GetUpperBound(0); i++) { v.Insert(0, i); var s = (int[,])t.Clone(); ReorderColsByColPerm(s, i); if (Search(b, k-1, s, v)) { return true; } v[0] += b.GetUpperBound(0)+1; s = (int[,])t.Clone(); ReorderRowsByRowPerm(s, i); if (Search(b, k-1, s, v)) { return true; } v.RemoveAt(0); } return false; } static int cycle(List p) { var t = new int[p.Count]; var w = p.ToArray(); for (var cnt = 1; ; cnt++) { for (var i = 0; i < p.Count; i++) { t[p[i]] = w[i]; } var ok = true; for (var i = 0; i < p.Count; i++) { if (t[i] != p[i]) { ok = false; } } if (ok) { return cnt; } var tmp = t; t = w; w = tmp; } } static void ReorderColsByColPerm(int[,] s, int x) { var p = SelectCol(s, x); var t = (int[,])s.Clone(); for (var r = 0; r <= s.GetUpperBound(0); r++) { for (var c = 0; c <= s.GetUpperBound(1); c++) { s[ r, t[c, x] ] = t[r, c]; } } } static void ReorderRowsByRowPerm(int[,] s, int y) { var p = SelectRow(s, y); var t = (int[,])s.Clone(); for (var r = 0; r <= s.GetUpperBound(0); r++) { for (var c = 0; c <= s.GetUpperBound(1); c++) { s[ t[y, r], c ] = t[r, c]; } } } static List SelectCol(int[,] s, int x) { var v = new List(); for (var r = 0; r <= s.GetUpperBound(0); r++) { v.Add(s[r,x]); } return v; } static List SelectRow(int[,] s, int y) { var v = new List(); for (var c = 0; c <= s.GetUpperBound(1); c++) { v.Add(s[y,c]); } return v; } static bool IsSame(int[,] s, int[,] t) { for (var r = 0; r <= s.GetUpperBound(0); r++) { for (var c = 0; c <= s.GetUpperBound(1); c++) { if (s[r,c] != t[r,c]) { return false; } } } return true; } public static void Main() { var input = ReadAll(); var n = input.Dequeue(); var k = input.Dequeue(); var a = new int[n,n]; var b = new int[n,n]; for (var r = 0; r < n; r++) { for (var c = 0; c < n; c++) { a[r,c] = input.Dequeue() - 1; } } for (var r = 0; r < n; r++) { for (var c = 0; c < n; c++) { b[r,c] = input.Dequeue() - 1; } } var ans = Solve(n, k, a, b); Console.Out.WriteLine(ans.Count); foreach (var op in ans) { if (op < n) { Console.Out.WriteLine("C {0}", op+1); } else { Console.Out.WriteLine("R {0}", op+1-n); } } } static Queue ReadAll() { return new Queue(Console.In.ReadToEnd().Trim() .Split(null).Select(s => Convert.ToInt32(s))); } }