#include <bits/stdc++.h>
using namespace std;
struct Move {
  int car, x, y;
  Move(int p_car, int p_x, int p_y) : car(p_car), x(p_x), y(p_y) {}
};
class Solver {
  vector<Move> ans;
  const int MAX_ROTATE_COUNT = 100;
  int n, k, a[5][55];

 public:
  Solver(int p_n, int p_k, int p_a[][55]) : n(p_n), k(p_k) {
    for (int i = 1; i <= 4; ++i) {
      for (int j = 1; j <= n; ++j) {
        a[i][j] = p_a[i][j];
      }
    }
  }
  int CheckParkableCars() {
    int parked = 0;
    for (int i = 1; i <= n; ++i) {
      if (a[2][i] && a[2][i] == a[1][i]) {
        ++parked;
        ans.push_back(Move(a[2][i], 1, i));
        a[2][i] = 0;
      }
      if (a[3][i] && a[3][i] == a[4][i]) {
        ++parked;
        ans.push_back(Move(a[3][i], 4, i));
        a[3][i] = 0;
      }
    }
    return parked;
  }
  pair<int, int> GetNext(int x, int y) {
    if (x == 2) {
      if (y == n)
        return make_pair(3, n);
      else
        return make_pair(2, y + 1);
    } else {
      if (y == 1)
        return make_pair(2, 1);
      else
        return make_pair(3, y - 1);
    }
  }
  pair<int, int> GetPrev(int x, int y) {
    if (x == 3) {
      if (y == n)
        return make_pair(2, n);
      else
        return make_pair(3, y + 1);
    } else {
      if (y == 1)
        return make_pair(3, 1);
      else
        return make_pair(2, y - 1);
    }
  }
  int getValueNext(int x, int y) {
    auto p = GetNext(x, y);
    return a[p.first][p.second];
  }
  void MoveNext(int x, int y) {
    auto p = GetNext(x, y);
    ans.push_back(Move(a[x][y], p.first, p.second));
    swap(a[p.first][p.second], a[x][y]);
  }
  void Rotate() {
    int sx = -1, sy = -1;
    for (int i = 1; i <= n; ++i) {
      if (a[2][i] && getValueNext(2, i) == 0) {
        sx = 2;
        sy = i;
      }
    }
    if (sx == -1) {
      for (int i = n; i >= 1; --i) {
        if (a[3][i] && getValueNext(3, i) == 0) {
          sx = 3;
          sy = i;
        }
      }
    }
    if (sx == -1) {
      return;
    }
    for (int i = 1; i <= n * 2 - 1; ++i) {
      if (a[sx][sy]) MoveNext(sx, sy);
      auto p = GetPrev(sx, sy);
      sx = p.first;
      sy = p.second;
    }
  }
  bool solve() {
    int rotate_count = 0;
    while (k > 0) {
      int parked = CheckParkableCars();
      if (parked) {
        rotate_count = 0;
        k -= parked;
      }
      if (++rotate_count > MAX_ROTATE_COUNT) {
        return false;
      }
      Rotate();
    }
    return true;
  }
  vector<Move> getAns() { return ans; }
};
int main() {
  int n, k, a[5][55];
  cin >> n >> k;
  for (int i = 1; i <= 4; ++i) {
    for (int j = 1; j <= n; ++j) {
      cin >> a[i][j];
    }
  }
  Solver s(n, k, a);
  if (s.solve()) {
    auto ans = s.getAns();
    cout << ans.size() << endl;
    for (int i = 0; i < ans.size(); ++i) {
      cout << ans[i].car << " " << ans[i].x << " " << ans[i].y << endl;
    }
  } else {
    cout << -1 << endl;
  }
  return 0;
}
