#include <bits/stdc++.h>
using namespace std;
template <typename T>
T Abs(T first) {
  return (first < 0 ? -first : first);
}
template <typename T>
T Sqr(T first) {
  return (first * first);
}
string plural(string s) {
  return (int((s).size()) && s[int((s).size()) - 1] == 'x' ? s + "en"
                                                           : s + "s");
}
const int INF = (int)1e9;
const long double EPS = 1e-12;
const long double PI = acos(-1.0);
bool Read(int &first) {
  char c, r = 0, n = 0;
  first = 0;
  for (;;) {
    c = getchar();
    if ((c < 0) && (!r)) return (0);
    if ((c == '-') && (!r))
      n = 1;
    else if ((c >= '0') && (c <= '9'))
      first = first * 10 + c - '0', r = 1;
    else if (r)
      break;
  }
  if (n) first = -first;
  return (1);
}
bool ReadLL(long long &first) {
  char c, r = 0, n = 0;
  first = 0;
  for (;;) {
    c = getchar();
    if ((c < 0) && (!r)) return (0);
    if ((c == '-') && (!r))
      n = 1;
    else if ((c >= '0') && (c <= '9'))
      first = first * 10 + c - '0', r = 1;
    else if (r)
      break;
  }
  if (n) first = -first;
  return (1);
}
int N, K;
int nans;
int ans1[200005], ans2[200005], ans3[200005];
int G[4][50];
vector<pair<int, int> > lst;
void Go(int i1, int j1, int i2, int j2) {
  ans1[nans] = G[i1][j1];
  ans2[nans] = i2 + 1;
  ans3[nans++] = j2 + 1;
  if (G[i2][j2])
    G[i1][j1] = G[i2][j2] = 0;
  else
    swap(G[i1][j1], G[i2][j2]);
}
void Rot() {
  int i, j, i1, j1, i2, j2;
  lst.clear();
  for (i = 0; i < N; i++) lst.push_back(make_pair(1, i));
  for (i = (N)-1; i >= 0; i--) lst.push_back(make_pair(2, i));
  for (i = 0; i < int((lst).size()); i++) {
    i1 = lst[i].first;
    j1 = lst[i].second;
    i2 = lst[(i + 1) % int((lst).size())].first;
    j2 = lst[(i + 1) % int((lst).size())].second;
    if (G[i1][j1] && !G[i2][j2]) break;
  }
  for (j = 0; j < int((lst).size()) - 1; j++) {
    i1 = lst[i].first;
    j1 = lst[i].second;
    i2 = lst[(i + 1) % int((lst).size())].first;
    j2 = lst[(i + 1) % int((lst).size())].second;
    if (G[i1][j1] && !G[i2][j2]) Go(i1, j1, i2, j2);
    i = (i + int((lst).size()) - 1) % int((lst).size());
  }
}
int main() {
  if (0) freopen("in.txt", "r", stdin);
  int i, j, k, c;
  Read(N), Read(K);
  for (i = 0; i < 4; i++)
    for (j = 0; j < N; j++) Read(G[i][j]);
  if (K == 2 * N) {
    for (i = 1; i <= 2; i++) {
      k = i == 1 ? 0 : 3;
      for (j = 0; j < N; j++)
        if (G[i][j] == G[k][j]) {
          Go(i, j, k, j);
          goto Good;
        }
    }
    printf("-1\n");
    return (0);
  Good:;
  }
  bool f = 1;
  for (;;) {
    for (i = 0; i < 4; i++)
      for (j = 0; j < N; j++)
        if (G[i][j]) goto Cont;
    break;
  Cont:;
    if (f)
      f = 0;
    else
      Rot();
    for (i = 0; i <= 3; i += 3)
      for (j = 0; j < N; j++)
        if (c = G[i][j]) {
          k = i == 0 ? 1 : 2;
          if (G[k][j] == c) Go(k, j, i, j);
        }
  }
  printf("%d\n", nans);
  for (i = 0; i < nans; i++) printf("%d %d %d\n", ans1[i], ans2[i], ans3[i]);
  return (0);
}
