#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
using namespace std;
template <typename T, typename TT>
inline ostream &operator<<(ostream &os, const pair<T, TT> &t) {
  return os << t.first << " " << t.second;
}
template <typename T>
inline ostream &operator<<(ostream &os, const vector<T> &t) {
  for (auto i : t) os << i << " ";
  return os;
}
template <typename T>
inline istream &operator>>(istream &is, vector<T> &v) {
  for (T &t : v) is >> t;
  return is;
}
template <typename T1, typename T2>
inline istream &operator>>(istream &is, pair<T1, T2> &t) {
  is >> t.first >> t.second;
  return is;
}
const long long mod = 1e9 + 7;
void solve() {
  long long n, k;
  cin >> n >> k;
  vector<vector<long long> > ans, v(4, vector<long long>(n));
  cin >> v;
  vector<pair<long long, long long> > dest(k + 1), cur(k + 1);
  for (int i = 0; i < n; i++) {
    if (v[0][i]) dest[v[0][i]] = {0, i};
    if (v[3][i]) dest[v[3][i]] = {3, i};
    if (v[1][i]) cur[v[1][i]] = {1, i};
    if (v[2][i]) cur[v[2][i]] = {2, i};
  }
  vector<vector<int> > vis(4, vector<int>(n));
  auto chng = [&](long long i, long long a, long long b) {
    ans.push_back({i, a + 1, b + 1});
    v[cur[i].first][cur[i].second] = 0;
    v[a][b] = i;
    cur[i] = {a, b};
  };
  function<bool(long long, long long)> move = [&](long long a, long long b) {
    if (a > 2 or a < 1 or b >= n or b < 0 or vis[a][b]) return 0;
    if (!v[a][b]) return 1;
    vis[a][b] = 1;
    if (a == 1 and !vis[a + 1][b] and move(a + 1, b)) {
      chng(v[a][b], a + 1, b);
      return 1;
    }
    if (a == 2 and !vis[a - 1][b] and move(a - 1, b)) {
      chng(v[a][b], a - 1, b);
      return 1;
    }
    if (b < n - 1 and !vis[a][b + 1] and move(a, b + 1)) {
      chng(v[a][b], a, b + 1);
      return 1;
    }
    if (b > 0 and !vis[a][b - 1] and move(a, b - 1)) {
      chng(v[a][b], a, b - 1);
      return 1;
    }
    return 0;
  };
  for (int i = 1; i <= k; i++) {
    if (dest[i].second == cur[i].second and
        abs(dest[i].first - cur[i].first) == 1) {
      chng(i, dest[i].first, dest[i].second);
    }
  }
  bool f = 0;
  for (int i = 0; i < n; i++) {
    if (v[1][i] == 0 or v[2][i] == 0) {
      f = 1;
      break;
    }
  }
  if (!f) {
    cout << -1 << '\n';
    return;
  }
  for (int i = 1; i <= k; i++) {
    if (cur[i] != dest[i]) {
      while (cur[i].second < dest[i].second) {
        vis = vector<vector<int> >(4, vector<int>(n));
        vis[cur[i].first][cur[i].second] = 1;
        move(cur[i].first, cur[i].second + 1);
        chng(i, cur[i].first, cur[i].second + 1);
      }
      while (cur[i].second > dest[i].second) {
        vis = vector<vector<int> >(4, vector<int>(n));
        vis[cur[i].first][cur[i].second] = 1;
        move(cur[i].first, cur[i].second - 1);
        chng(i, cur[i].first, cur[i].second - 1);
      }
      if (cur[i].first - dest[i].first == 2) {
        vis = vector<vector<int> >(4, vector<int>(n));
        vis[cur[i].first][cur[i].second] = 1;
        move(cur[i].first - 1, cur[i].second);
        chng(i, cur[i].first - 1, cur[i].second);
      }
      if (cur[i].first - dest[i].first == -2) {
        vis = vector<vector<int> >(4, vector<int>(n));
        vis[cur[i].first][cur[i].second] = 1;
        move(cur[i].first + 1, cur[i].second);
        chng(i, cur[i].first + 1, cur[i].second);
      }
      chng(i, dest[i].first, dest[i].second);
    }
  }
  cout << ans.size() << '\n';
  for (auto &x : ans) cout << x << '\n';
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  ;
  int T = 1;
  while (T--) {
    solve();
  }
  return 0;
}
