#include <bits/stdc++.h>
using namespace std;
const long long int inf = 1000000000;
const long long int mod = 1000000000 + 7;
inline void IO() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
}
inline int dcmp(long double x) { return x < -1e-12 ? -1 : (x > 1e-12); }
template <class T>
inline int CHECK(T MASK, int i) {
  return (MASK >> i) & 1;
}
template <class T>
inline T ON(T MASK, int i) {
  return MASK | (T(1) << i);
}
template <class T>
inline T OFF(T MASK, int i) {
  return MASK & (~(T(1) << i));
}
template <typename T>
inline int CNT(T MASK) {
  if (numeric_limits<T>::digits <= numeric_limits<unsigned int>::digits)
    return __builtin_popcount(MASK);
  else
    return __builtin_popcountll(MASK);
}
template <class T>
inline int RIGHT(T MASK) {
  return log2(MASK & -MASK);
}
int dx4[] = {0, 0, -1, +1};
int dy4[] = {+1, -1, 0, 0};
int dx8[] = {1, 1, 0, -1, -1, -1, 0, 1, 0};
int dy8[] = {0, 1, 1, 1, 0, -1, -1, -1, 0};
inline void I(int& a) { scanf("%d", &a); }
inline void I(long long int& a) { scanf("%I64d", &a); }
inline void I(unsigned long long int& a) { scanf("%I64u", &a); }
inline void I(char* a) { scanf("%s", a); }
char Iarr[2000010];
inline void I(string& a) {
  scanf("%s", Iarr);
  a = Iarr;
}
template <typename T, typename... Args>
void I(T& a, Args&... args) {
  I(a);
  I(args...);
}
inline void OUT(int a) { printf("%d", a); }
inline void OUT(long long int a) { printf("%I64d", a); }
inline void OUT(const char* a) { printf("%s", a); }
inline void OUT(char* a) { printf("%s", a); }
inline void OUT(bool a) { printf("%d", a); }
inline void OUT(string a) {
  for (__typeof(a.end()) it = (a.begin()) - ((a.begin()) > (a.end()));
       it != (a.end()) - ((a.begin()) > (a.end()));
       it += 1 - 2 * ((a.begin()) > (a.end())))
    printf("%c", *it);
}
inline void OUT(unsigned long long int a) { printf("%I64u", a); }
template <typename T, typename... Args>
void OUT(T a, Args... args) {
  OUT(a);
  OUT(" ");
  OUT(args...);
}
template <typename... Args>
void O(Args... args) {
  OUT(args...);
  OUT("\n");
}
template <typename T1, typename T2>
inline ostream& operator<<(ostream& os, pair<T1, T2> p) {
  os << "{" << p.first << ", " << p.second << "}";
  return os;
}
template <typename T>
inline ostream& operator<<(ostream& os, vector<T>& a) {
  os << "[";
  for (int i = 0; i < (int)a.size(); i++) {
    if (i) os << ", ";
    os << a[i];
  }
  os << "]";
  return os;
}
void err(istream_iterator<string> it) {}
template <typename T, typename... Args>
void err(istream_iterator<string> it, T a, Args... args) {
  cout << *it << " = " << a << endl;
  err(++it, args...);
}
const int M = 500;
int c, k;
int g[M][M];
int gg[M][M];
pair<int, int> space;
int nxtNum;
pair<int, int> nxtNumDest;
pair<int, int> nextt;
vector<pair<int, pair<int, int> > > ans;
vector<string> codes;
pair<int, int> init() {
  for (int i = 1; i <= c; i++) {
    if (g[1][i] == g[2][i] && g[1][i]) {
      ans.push_back(make_pair(g[2][i], make_pair(1, i)));
      codes.push_back(" init ");
      if ((int)codes.size() > 20000)
        cout << codes[(int)codes.size() - 1] << endl;
      g[2][i] = 0;
    }
    if (g[3][i] == g[4][i] && g[3][i]) {
      ans.push_back(make_pair(g[3][i], make_pair(4, i)));
      codes.push_back(" init ");
      if ((int)codes.size() > 20000)
        cout << codes[(int)codes.size() - 1] << endl;
      g[3][i] = 0;
    }
  }
  for (int i = 1; i <= c; i++) {
    if (!g[2][i]) return make_pair(2, i);
    if (!g[3][i]) return make_pair(3, i);
  }
  int ret = inf;
  for (int i = 1; i <= c; i++) {
    if (g[2][i] + g[3][i]) ret = -1;
  }
  return make_pair(ret, ret);
}
pair<int, int> nxt() {
  pair<int, int> ret = {-1, -1};
  int dist = inf;
  for (int i = 1; i <= c; i++) {
    if (g[2][i]) {
      int temp = abs(2 - space.first) + abs(i - space.second);
      if (temp < dist) {
        dist = temp;
        ret = make_pair(2, i);
        nxtNum = g[2][i];
      }
    }
    if (g[3][i]) {
      int temp = abs(3 - space.first) + abs(i - space.second);
      if (temp < dist) {
        dist = temp;
        ret = make_pair(3, i);
        nxtNum = g[3][i];
      }
    }
  }
  return ret;
}
void spaceToThis(int rr, int cc) {
  if (g[rr][cc] == 0) {
    space = make_pair(rr, cc);
    return;
  }
  pair<int, int> ret = {-1, -1};
  int dist = inf;
  for (int i = 1; i <= c; i++) {
    if (!g[2][i]) {
      int temp = abs(2 - rr) + abs(i - cc);
      if (2 == rr && nextt.first == 2) temp += 2;
      if (temp < dist) {
        dist = temp;
        ret = make_pair(2, i);
      }
    }
    if (!g[3][i]) {
      int temp = abs(3 - rr) + abs(i - cc);
      if (3 == rr && nextt.first == 3) temp += 2;
      if (temp < dist) {
        dist = temp;
        ret = make_pair(3, i);
      }
    }
  }
  space = ret;
  int cons = 0;
  bool flagg = 0;
  int cnt = 0;
  pair<int, int> iniii = space;
  if (dist >= 2) {
    if (g[5 - nextt.first][nextt.second] == 0)
      space = make_pair(5 - nextt.first, nextt.second);
  }
  while (space != make_pair(rr, cc)) {
    int nxtRow =
        space.first +
        (((rr - space.first) > 0) ? 1 : (((rr - space.first) == 0) ? 0 : -1));
    int nxtCol =
        space.second +
        (((cc - space.second) > 0) ? 1 : (((cc - space.second) == 0) ? 0 : -1));
    if (make_pair(space.first, nxtCol) != nextt && g[space.first][nxtCol]) {
      ans.push_back(make_pair(g[space.first][nxtCol], space));
      codes.push_back(" spaceToThis ");
      swap(g[space.first][nxtCol], g[space.first][space.second]);
      space = make_pair(space.first, nxtCol);
      if ((int)codes.size() > 20000)
        cout << codes[(int)codes.size() - 1] << endl;
      cons = 0;
    } else if (make_pair(nxtRow, space.second) != nextt &&
               g[nxtRow][space.second]) {
      ans.push_back(make_pair(g[nxtRow][space.second], space));
      codes.push_back(" spaceToThis ");
      swap(g[nxtRow][space.second], g[space.first][space.second]);
      space = make_pair(nxtRow, space.second);
      if ((int)codes.size() > 20000)
        cout << codes[(int)codes.size() - 1] << endl;
      cons = 0;
    } else if (nxtRow == rr) {
      flagg = 1;
      nxtRow = ((nxtRow == 2) ? 3 : 2);
      if (make_pair(nxtRow, space.second) != nextt && g[nxtRow][space.second]) {
        ans.push_back(make_pair(g[nxtRow][space.second], space));
        codes.push_back(" spaceToThis ");
        swap(g[nxtRow][space.second], g[space.first][space.second]);
        space = make_pair(nxtRow, space.second);
        if ((int)codes.size() > 20000)
          cout << codes[(int)codes.size() - 1] << endl;
      } else {
      }
    } else {
    }
    cnt++;
    if (cnt >= 300) {
      cout << cnt << endl;
      cout << space << make_pair(rr, cc) << endl;
      {
        string _s = "g[3][34], g[2][34], iniii, nxtNum";
        replace(_s.begin(), _s.end(), ',', ' ');
        stringstream _ss(_s);
        istream_iterator<string> _it(_ss);
        err(_it, g[3][34], g[2][34], iniii, nxtNum);
      };
    }
  }
}
void spaceToMyAid() {
  if (nextt.first < nxtNumDest.first) {
    spaceToThis(nextt.first + 1, nextt.second);
    ans.push_back(make_pair(nxtNum, make_pair(nextt.first + 1, nextt.second)));
    swap(g[nextt.first][nextt.second], g[nextt.first + 1][nextt.second]);
    space = nextt;
    nextt = make_pair(nextt.first + 1, nextt.second);
    codes.push_back(" spaceToMyAid ");
    if ((int)codes.size() > 20000) cout << codes[(int)codes.size() - 1] << endl;
  } else if (nextt.first > nxtNumDest.first) {
    spaceToThis(nextt.first - 1, nextt.second);
    ans.push_back(make_pair(nxtNum, make_pair(nextt.first - 1, nextt.second)));
    swap(g[nextt.first][nextt.second], g[nextt.first - 1][nextt.second]);
    space = nextt;
    nextt = make_pair(nextt.first - 1, nextt.second);
    codes.push_back(" spaceToMyAid ");
    if ((int)codes.size() > 20000) cout << codes[(int)codes.size() - 1] << endl;
  } else if (nextt.second < nxtNumDest.second) {
    spaceToThis(nextt.first, nextt.second + 1);
    ans.push_back(make_pair(nxtNum, make_pair(nextt.first, nextt.second + 1)));
    swap(g[nextt.first][nextt.second], g[nextt.first][nextt.second + 1]);
    space = nextt;
    nextt = make_pair(nextt.first, nextt.second + 1);
    codes.push_back(" spaceToMyAid ");
    if ((int)codes.size() > 20000) cout << codes[(int)codes.size() - 1] << endl;
  } else {
    spaceToThis(nextt.first, nextt.second - 1);
    ans.push_back(make_pair(nxtNum, make_pair(nextt.first, nextt.second - 1)));
    swap(g[nextt.first][nextt.second], g[nextt.first][nextt.second - 1]);
    space = nextt;
    nextt = make_pair(nextt.first, nextt.second - 1);
    codes.push_back(" spaceToMyAid ");
    if ((int)codes.size() > 20000) cout << codes[(int)codes.size() - 1] << endl;
  }
}
void goNexttToDest() {
  for (int i = 1; i <= c; i++) {
    if (g[1][i] == nxtNum) {
      nxtNumDest.first = 2;
      nxtNumDest.second = i;
      break;
    }
    if (g[4][i] == nxtNum) {
      nxtNumDest.first = 3;
      nxtNumDest.second = i;
      break;
    }
  }
  int cnt = 0;
  while (nextt.first != nxtNumDest.first || nextt.second != nxtNumDest.second) {
    spaceToMyAid();
    cnt++;
    if (cnt >= 300) {
      cout << nextt << " " << nxtNumDest << endl;
    }
  }
  g[nxtNumDest.first][nxtNumDest.second] = 0;
  ans.push_back(make_pair(
      nxtNum, make_pair(((nxtNumDest.first == 2) ? 1 : 4), nxtNumDest.second)));
  codes.push_back(" goNexttToDest ");
  if ((int)codes.size() > 20000) cout << codes[(int)codes.size() - 1] << endl;
}
int main() {
  I(c, k);
  for (int i = 1; i <= 4; i++) {
    for (int j = 1; j <= c; j++) {
      I(g[i][j]);
      gg[i][j] = g[i][j];
    }
  }
  space = init();
  if (space.first == -1) {
    O(-1);
    exit(0);
  } else if (space.first != inf) {
    while (k--) {
      nextt = nxt();
      if (nextt.first == -1) {
        break;
      }
      goNexttToDest();
    }
  }
  O((int)ans.size());
  int cnt = 0;
  for (int i = 1; i <= c; i++) {
    gg[1][i] = gg[4][i] = 0;
  }
  for (pair<int, pair<int, int> > v : ans) {
    cnt++;
    bool flag = 1;
    for (int i = 2; i <= 3 && flag; i++) {
      for (int j = 1; j <= c && flag; j++) {
        if (gg[i][j] == v.first) {
          if (abs(i - v.second.first) + abs(j - v.second.second) != 1) {
            cout << cnt << codes[cnt - 1]
                 << abs(i - v.second.first) + abs(j - v.second.second) << " "
                 << make_pair(i, j)
                 << make_pair(v.second.first, v.second.second) << endl;
          }
          swap(gg[i][j], gg[v.second.first][v.second.second]);
          flag = 0;
        }
      }
    }
  }
  for (pair<int, pair<int, int> > v : ans) {
    O(v.first, v.second.first, v.second.second);
  }
  return 0;
}
