#include <bits/stdc++.h>
using namespace std;
struct Move {
  Move() = default;
  Move(int _i, int _r, int _c) : i(_i), r(_r), c(_c) {}
  int i;
  int r;
  int c;
};
int n, k;
int table[4][50];
char notInPlace[110];
pair<int, int> startPosition[110];
pair<int, int> finishPosition[110];
pair<int, int> emptyCell;
int dr[] = {-1, 1, 0, 0};
int dc[] = {0, 0, -1, 1};
pair<int, int> nextCell(const pair<int, int>& cell) {
  if (cell.first == 1) {
    if (cell.second == n - 1) return make_pair(2, n - 1);
    return make_pair(1, cell.second + 1);
  }
  if (cell.first == 2) {
    if (cell.second == 0) return make_pair(1, 0);
    return make_pair(2, cell.second - 1);
  }
  throw 2;
}
pair<int, int> prevCell(const pair<int, int>& cell) {
  for (int i = 1; i < 3; i++) {
    for (int j = 0; j < n; j++) {
      if (nextCell(make_pair(i, j)) == cell) return make_pair(i, j);
    }
  }
  throw 2;
}
void doCycle(vector<Move>& moves) {
  pair<int, int> cur = emptyCell;
  do {
    pair<int, int> c = nextCell(cur);
    if (table[c.first][c.second] != 0)
      moves.emplace_back(table[c.first][c.second], cur.first + 1,
                         cur.second + 1);
    table[cur.first][cur.second] = table[c.first][c.second];
    cur = c;
  } while (nextCell(cur) != emptyCell);
  emptyCell = prevCell(emptyCell);
  table[emptyCell.first][emptyCell.second] = 0;
}
int main() {
  cin >> n >> k;
  for (int i = 0; i < k; i++) notInPlace[i] = true;
  for (int i = 0; i < 4; i++) {
    for (int j = 0; j < n; j++) {
      cin >> table[i][j];
      if ((i == 0 || i == 3) && table[i][j] != 0)
        finishPosition[table[i][j] - 1] = make_pair(i, j);
      if ((i == 1 || i == 2) && table[i][j] != 0)
        startPosition[table[i][j] - 1] = make_pair(i, j);
    }
  }
  vector<Move> ans;
  int cnt = k;
  if (k == 2 * n) {
    bool exists = false;
    for (int i = 0; i < k && !exists; i++) {
      pair<int, int>& start = startPosition[i];
      pair<int, int>& finish = finishPosition[i];
      if (start.first == 1 && finish.first == 0 &&
              start.second == finish.second ||
          start.first == 2 && finish.first == 3 &&
              start.second == finish.second) {
        ans.emplace_back(i + 1, finish.first + 1, finish.second + 1);
        cnt--;
        table[start.first][start.second] = 0;
        exists = true;
      }
    }
    if (!exists) {
      cout << -1 << endl;
      return 0;
    }
  }
  for (int i = 1; i < 3; i++) {
    for (int j = 0; j < n; j++) {
      if (table[i][j] == 0) emptyCell = make_pair(i, j);
    }
  }
  while (cnt > 0) {
    doCycle(ans);
    for (int i = 1; i < 3; i++) {
      for (int j = 0; j < n; j++) {
        if (table[i][j] == 0) continue;
        if (i == 1 && finishPosition[table[i][j] - 1] == make_pair(0, j)) {
          ans.emplace_back(table[i][j], 1, j + 1);
          cnt--;
          table[i][j] = 0;
        }
        if (i == 2 && finishPosition[table[i][j] - 1] == make_pair(3, j)) {
          ans.emplace_back(table[i][j], 4, j + 1);
          cnt--;
          table[i][j] = 0;
        }
      }
    }
  }
  cout << ans.size() << endl;
  for (auto move : ans)
    cout << move.i << ' ' << move.r << ' ' << move.c << endl;
  return 0;
}
