#include <bits/stdc++.h>
using namespace std;
const long long mod = 1000000007;
long long powmod(long long a, long long b) {
  long long res = 1;
  a %= mod;
  assert(b >= 0);
  for (; b; b >>= 1) {
    if (b & 1) res = res * a % mod;
    a = a * a % mod;
  }
  return res;
}
long long gcd(long long a, long long b) { return b ? gcd(b, a % b) : a; }
const int N = 1010;
int dx[] = {1, 0, -1, 0}, dy[] = {0, 1, 0, -1};
pair<int, int> q[N];
int vis[5][N], car[5][N], n;
pair<int, int> pre[5][N];
vector<vector<int> > ret;
void getpath(int x, int y) {
  for (int i = 0; i < 4; i++)
    for (int j = 0; j < n; j++) vis[i][j] = 0, pre[i][j] = make_pair(-1, -1);
  int t = 0;
  q[t++] = make_pair(x, y);
  vis[x][y] = 1;
  for (int i = 0; i < t; i++) {
    int px = q[i].first, py = q[i].second;
    if (car[px][py] == 0) {
      while (1) {
        int qx = pre[px][py].first, qy = pre[px][py].second;
        if (qx == -1 && qy == -1) break;
        assert(car[qx][qy] > 0);
        ret.push_back(vector<int>{car[qx][qy], px, py});
        car[px][py] = car[qx][qy];
        car[qx][qy] = 0;
        px = qx;
        py = qy;
      }
      return;
    }
    for (int k = 0; k < 4; k++) {
      int qx = px + dx[k], qy = py + dy[k];
      if (qx >= 1 && qx <= 2 && qy >= 0 && qy < n && car[qx][qy] != -1 &&
          !vis[qx][qy]) {
        pre[qx][qy] = make_pair(px, py);
        vis[qx][qy] = 1;
        q[t++] = make_pair(qx, qy);
      }
    }
  }
}
void go1(int x, int y, int c) {
  int posx = -1, posy = -1;
  for (int i = 1; i < 3; i++)
    for (int j = 0; j < n; j++)
      if (car[i][j] == c) {
        posx = i;
        posy = j;
        break;
      }
  int goalx = x ^ 1, goaly = y;
  while (posx != goalx || posy != goaly) {
    int nxtx = -1, nxty = -1;
    for (int i = 0; i < 4; i++) {
      int curx = posx + dx[i], cury = posy + dy[i];
      if (abs(curx - goalx) + abs(cury - goaly) <
          abs(posx - goalx) + abs(posy - goaly)) {
        nxtx = curx, nxty = cury;
        break;
      }
    }
    car[posx][posy] = -1;
    getpath(nxtx, nxty);
    ret.push_back(vector<int>{c, nxtx, nxty});
    car[posx][posy] = 0;
    car[nxtx][nxty] = c;
    posx = nxtx;
    posy = nxty;
  }
  ret.push_back(vector<int>{c, goalx ^ 1, goaly});
  car[goalx][goaly] = car[goalx ^ 1][goaly] = 0;
}
int main() {
  scanf("%d%*d", &n);
  for (int i = 0; i < 4; i++)
    for (int j = 0; j < n; j++) scanf("%d", &car[i][j]);
  for (int j = 0; j < n; j++) {
    if (car[0][j] == car[1][j] && car[0][j] != 0) {
      ret.push_back(vector<int>{car[1][j], 0, j});
      car[0][j] = car[1][j] = 0;
    }
    if (car[2][j] == car[3][j] && car[2][j] != 0) {
      ret.push_back(vector<int>{car[2][j], 3, j});
      car[2][j] = car[3][j] = 0;
    }
  }
  bool empty = 0;
  for (int j = 0; j < n; j++)
    if (car[1][j] == 0 || car[2][j] == 0) empty = 1;
  if (!empty) {
    puts("-1");
    return 0;
  }
  for (int j = 0; j < n; j++) {
    if (car[0][j]) go1(0, j, car[0][j]);
    if (car[3][j]) go1(3, j, car[3][j]);
  }
  printf("%d\n", ((int)(ret).size()));
  for (auto p : ret) {
    printf("%d %d %d\n", p[0], p[1] + 1, p[2] + 1);
  }
}
