#include <bits/stdc++.h>
using namespace std;
template <class T>
inline T bigmod(T p, T e, T M) {
  long long int ret = 1;
  for (; e > 0; e >>= 1) {
    if (e & 1) ret = (ret * p) % M;
    p = (p * p) % M;
  }
  return (T)ret;
}
template <class T>
inline T gcd(T a, T b) {
  if (b == 0) return a;
  return gcd(b, a % b);
}
template <class T>
inline T modinverse(T a, T M) {
  return bigmod(a, M - 2, M);
}
template <class T>
inline T bpow(T p, T e) {
  long long int ret = 1;
  for (; e > 0; e >>= 1) {
    if (e & 1) ret = (ret * p);
    p = (p * p);
  }
  return (T)ret;
}
int toInt(string s) {
  int sm;
  stringstream ss(s);
  ss >> sm;
  return sm;
}
int toLlint(string s) {
  long long int sm;
  stringstream ss(s);
  ss >> sm;
  return sm;
}
int ts, kk = 1;
int n, m;
int ps[105][2];
int pk[105][2];
int gr[4][105];
vector<pair<int, pair<int, int> > > rs;
void prnt() {}
void right() {
  int i, j, k;
  for (i = 1; i < 3; i++) {
    for (j = n - 2; j > -1; j--) {
      k = j;
      while (k < n - 2) {
        if (gr[i][k] != 0 && gr[i][k + 1] == 0) {
          swap(gr[i][k], gr[i][k + 1]);
          rs.push_back({gr[i][k + 1], {i, k + 1}});
          prnt();
        }
        k++;
      }
    }
  }
}
pair<int, int> ls[105];
int r;
void ins(int x, int y) { ls[r++] = {x, y}; }
bool empt() { return (r == 0); }
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, 1, 0, -1};
pair<int, int> calc(pair<int, int> q) {
  int x = q.first;
  int y = q.second;
  int bs = 2 * (int)(q.first == 2);
  for (int i = 0; i < 2; i++) {
    int nx = q.first + dx[bs + i];
    int ny = q.second + dy[bs + i];
    if (nx < 0 || ny < 0 || nx >= 4 || ny >= n) continue;
    if (nx == 0 || nx == 3) {
      if (gr[nx][ny] == gr[x][y]) return {nx, ny};
    } else if (gr[nx][ny] == 0)
      return {nx, ny};
  }
  if (q.first == 1 && q.second == n - 1 && gr[2][n - 1] == 0) return {2, n - 1};
  if (q.first == 2 && q.second == 0 && gr[1][0] == 0) return {1, 0};
  return {-1, -1};
}
bool mov() {
  bool ok = 0;
  int i, j, k;
  k = 150;
  while (k-- && r) {
    for (i = 0; i < r; i++) {
      pair<int, int> q = calc(ls[i]);
      if (q == pair<int, int>(-1, -1)) continue;
      if (q.first == 0 || q.first == 3) {
        rs.push_back({gr[ls[i].first][ls[i].second], {q.first, q.second}});
        prnt();
        gr[ls[i].first][ls[i].second] = 0;
        ok = 1;
        for (j = i; j < r - 1; j++) ls[j] = ls[j + 1];
        r--;
        i--;
      } else {
        rs.push_back({gr[ls[i].first][ls[i].second], {q.first, q.second}});
        prnt();
        swap(gr[q.first][q.second], gr[ls[i].first][ls[i].second]);
        ls[i] = q;
      }
    }
  }
  return ok;
}
int main() {
  int i, j, k;
  r = 0;
  scanf("%d%d", &n, &m);
  for (i = 0; i < 4; i++) {
    for (j = 0; j < n; j++) scanf("%d", &gr[i][j]);
  }
  right();
  int id = 1;
  for (i = 0; i < n; i++) {
    if (gr[2][i]) ins(2, i);
  }
  for (i = n - 1; i > -1; i--) {
    if (gr[1][i]) ins(1, i);
  }
  while (r) {
    if (!mov()) break;
  }
  if (r > 0)
    printf("-1\n");
  else {
    for (i = 0; i < n; i++)
      if (gr[1][i] || gr[2][i]) assert(0);
    assert(rs.size() <= 20000);
    printf("%d\n", rs.size());
    for (auto x : rs)
      printf("%d %d %d\n", x.first, x.second.first + 1, x.second.second + 1);
  }
  return 0;
}
