#include <bits/stdc++.h>
using namespace std;
const int MAXN = 110;
const int MAXM = 22000;
const int dir[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
struct Pos {
  int x, y;
  Pos() {}
  Pos(int a, int b) : x(a), y(b) {}
} p[MAXN];
struct Oper {
  int id, x, y;
  Oper() {}
  Oper(int d, int a, int b) : id(d), x(a), y(b) {}
} op[MAXM];
int n, m, k;
int a[5][MAXN];
int par[5][MAXN];
bool vis[5][MAXN];
void move(int x1, int y1, int x2, int y2) {
  memset(vis, 0, sizeof vis);
  queue<Pos> que;
  que.push(Pos(x2, y2));
  int x, y;
  while (!que.empty()) {
    Pos u = que.front();
    que.pop();
    if (!a[u.x][u.y]) {
      x = u.x, y = u.y;
      break;
    }
    for (int i = 0; i < 4; i++) {
      int tx = u.x + dir[i][0], ty = u.y + dir[i][1];
      if (2 <= tx && tx <= 3 && 1 <= ty && ty <= n && (tx != x1 || ty != y1) &&
          !vis[tx][ty]) {
        que.push(Pos(tx, ty));
        par[tx][ty] = i;
        vis[tx][ty] = 1;
      }
    }
  }
  while (x != x2 || y != y2) {
    int tx = x - dir[par[x][y]][0], ty = y - dir[par[x][y]][1];
    op[++m] = Oper(a[tx][ty], x, y);
    swap(a[tx][ty], a[x][y]);
    x = tx, y = ty;
  }
  op[++m] = Oper(a[x1][y1], x2, y2);
  swap(a[x1][y1], a[x2][y2]);
}
int main() {
  scanf("%d%d", &n, &k);
  m = 0;
  for (int i = 1; i <= 4; i++)
    for (int j = 1; j <= n; j++) scanf("%d", &a[i][j]);
  for (int i = 1; i <= n; i++) {
    if (a[1][i]) p[a[1][i]] = Pos(2, i);
    if (a[2][i] && a[2][i] == a[1][i]) {
      op[++m] = Oper(a[2][i], 1, i);
      a[2][i] = 0;
    }
    if (a[3][i] && a[3][i] == a[4][i]) {
      op[++m] = Oper(a[3][i], 4, i);
      a[3][i] = 0;
    }
    if (a[4][i]) p[a[4][i]] = Pos(3, i);
  }
  int cnt = 0;
  for (int i = 2; i <= 3; i++)
    for (int j = 1; j <= n; j++)
      if (a[i][j]) cnt++;
  if (cnt == 2 * n) {
    puts("-1");
    return 0;
  }
  while (cnt--) {
    for (int i = 2; i <= 3; i++)
      for (int j = 1; j <= n; j++)
        if (a[i][j]) {
          int t = a[i][j];
          if (i == p[t].x) {
            for (int k = j; k < p[t].y; k++) move(i, k, i, k + 1);
            for (int k = j; k > p[t].y; k--) move(i, k, i, k - 1);
            op[++m] = Oper(t, i == 2 ? 1 : 4, p[t].y);
            a[i][p[t].y] = 0;
          } else {
            for (int k = j; k < p[t].y; k++) move(i, k, i, k + 1);
            for (int k = j; k > p[t].y; k--) move(i, k, i, k - 1);
            move(i, p[t].y, p[t].x, p[t].y);
            op[++m] = Oper(t, i == 2 ? 4 : 1, p[t].y);
            a[i == 2 ? 3 : 2][p[t].y] = 0;
          }
          goto nxt;
        }
  nxt:;
  }
  printf("%d\n", m);
  for (int i = 1; i <= m; i++) printf("%d %d %d\n", op[i].id, op[i].x, op[i].y);
  return 0;
}
