#include <bits/stdc++.h>
using namespace std;
int G[6][60], n, k, have;
struct GOAL {
  int x, y;
  GOAL(int _x = 0, int _y = 0) { x = _x, y = _y; }
} goal[110];
struct POS {
  int x, y;
  POS(int _x = 0, int _y = 0) { x = _x, y = _y; }
} pos[110];
bool used[110];
struct MOVE {
  int ind, x, y;
  MOVE(int _i = 0, int _x = 0, int _y = 0) { ind = _i, x = _x, y = _y; }
};
MOVE ans[20005], stac[20005];
int ans_cnt = 0;
void check() {
  for (int i = 1; i <= k; i++) {
    if (!used[i]) {
      if (pos[i].y == goal[i].y && abs(pos[i].x - goal[i].x) == 1) {
        have--;
        used[i] = true;
        G[pos[i].x][pos[i].y] = 0;
        pos[i] = POS();
        ans[ans_cnt++] = MOVE(i, goal[i].x, goal[i].y);
      }
    }
  }
}
void reset() {
  for (int i = 2; i < 4; i++) {
    for (int j = 1; j <= n; j++) {
      if (G[i][j]) {
        int id = G[i][j];
        for (int ny = j - 1; ny > 0; ny--) {
          if (G[i][ny]) break;
          G[i][ny] = id;
          G[i][ny + 1] = 0;
          ans[ans_cnt++] = MOVE(id, i, ny);
          pos[id] = POS(i, ny);
        }
      }
    }
  }
}
int other(int x) {
  if (x == 2) return 3;
  return 2;
}
POS nex[6][60], pre[6][60];
void moves() {
  int nx = 2, ny = 1;
  int limitx, limity;
  while (1) {
    int dx = nex[nx][ny].x, dy = nex[nx][ny].y;
    if (!G[dx][dy]) {
      limitx = dx, limity = dy;
      break;
    }
    nx = dx, ny = dy;
  }
  while (1) {
    if (G[nx][ny]) {
      int id = G[nx][ny];
      int dx = nex[nx][ny].x, dy = nex[nx][ny].y;
      ans[ans_cnt++] = MOVE(id, dx, dy);
      swap(G[nx][ny], G[dx][dy]);
      pos[id] = POS(dx, dy);
    }
    int tnx = nx, tny = ny;
    nx = pre[tnx][tny].x, ny = pre[tnx][tny].y;
    if (nx == limitx && ny == limity) return;
  }
}
int main() {
  scanf("%d%d", &n, &k);
  for (int i = 1; i <= 4; i++) {
    for (int j = 1; j <= n; j++) {
      scanf("%d", &G[i][j]);
      if (!G[i][j]) continue;
      if (i == 1 || i == 4)
        goal[G[i][j]] = GOAL(i, j);
      else
        pos[G[i][j]] = POS(i, j);
    }
  }
  for (int j = 1; j <= n; j++) {
    if (j < n)
      nex[2][j] = POS(2, j + 1);
    else
      nex[2][j] = POS(3, j);
  }
  for (int j = 1; j <= n; j++) {
    if (j > 1)
      nex[3][j] = POS(3, j - 1);
    else
      nex[3][j] = POS(2, j);
  }
  for (int i = 2; i < 4; i++) {
    for (int j = 1; j <= n; j++) {
      int nx = nex[i][j].x, ny = nex[i][j].y;
      pre[nx][ny] = POS(i, j);
    }
  }
  have = k;
  check();
  if (have == 2 * n) {
    puts("-1");
    return 0;
  }
  if (!have) {
    printf("%d\n", ans_cnt);
    for (int i = 0; i < ans_cnt; i++)
      printf("%d %d %d\n", ans[i].ind, ans[i].x, ans[i].y);
    return 0;
  }
  reset();
  while (have) {
    moves();
    check();
  }
  printf("%d\n", ans_cnt);
  for (int i = 0; i < ans_cnt; i++)
    printf("%d %d %d\n", ans[i].ind, ans[i].x, ans[i].y);
  return 0;
}
