#include <bits/stdc++.h>   using namespace std;   const int maxN = (int)3e5, maxM = (int)2e3, intMax = INT_MAX,             maxValue = (int)1e4, intInf = (int)1e9, mod = (int)1e9 + 7, www = 97;   const long long llmax = LLONG_MAX, INF = (long long)1e9 + 1;   long long nod(long long a, long long b) {     while (a != 0 && b != 0) {       if (a < b)         b %= a;       else         a %= b;     }     return a + b;   }   int nod(int a, int b) {     while (a != 0 && b != 0) {       if (a < b)         b %= a;       else         a %= b;     }     return a + b;   }   long long nok(long long a, long long b) { return a * b / nod(a, b); }   int nok(int a, int b) { return a * b / nod(a, b); }   long long modPlus(long long a, long long b) {     return ((a % mod) + (b % mod)) % mod;   }   int modPlus(int a, int b) { return ((a % mod) + (b % mod)) % mod; }   long long binPow(long long a, long long b) {     long long res = 1;     while (b) {       if (b % 2 == 1) res = (res * a) % mod;       a = (a * a) % mod;       b >>= 1;     }     return res;   }   double binPow(double a, long long b) {     double res = 1;     while (b) {       if (b % 2 == 1) {         res *= a;         while (res >= mod) res -= mod;       }       a *= a;       while (a >= mod) a -= mod;       b >>= 1;     }     return res;   }   long long mulmod(long long a, long long b) {     long long res = 0;     a = a % mod;     while (b > 0) {       if (b % 2 == 1) res = (res + a) % mod;       a = (a * 2) % mod;       b /= 2;     }     return res % mod;   }   pair<int, int> max(pair<int, int> a, pair<int, int> b) {     if (a.first > b.first) return a;     if (a.first < b.first) return b;     if (a.second > b.second) return a;     return b;   }   pair<int, int> min(pair<int, int> a, pair<int, int> b) {     if (a.first < b.first) return a;     if (a.first != b.first) return b;     if (a.second < b.second) return a;     return b;   }   int n, k, Q[4][maxN];   vector<tuple<int, int, int> > res;   int main() {     scanf( %d%d , &n, &k);     int x = -1, y = -1;     int count = 0;     for (int i = 0; i < 4; ++i) {       for (int j = 0; j < n; ++j) {         scanf( %d , &Q[i][j]);         if (i && i < 3) {           if (Q[i][j])             count++;           else {             x = j;             y = i - 1;           }         }         if ((i == 1 || i == 3) && Q[i - 1][j] == Q[i][j]) {           x = j;           if (i == 1)             y = 0;           else             y = 1;         }       }     }     if (x == -1) {       printf( %d n , -1);       fflush(stdout);       return 0;     }     while (count) {       if (y) {         if (Q[1 + y][x]) {           res.emplace_back(Q[1 + y][x], 4, x + 1);           Q[1 + y][x] = 0;           count--;         } else if (x) {           if (Q[1 + y][x - 1] && Q[1 + y][x - 1] != Q[2 + y][x - 1]) {             res.emplace_back(Q[1 + y][x - 1], 3, x + 1);             Q[1 + y][x] = Q[1 + y][x - 1];             Q[1 + y][x - 1] = 0;           }           x--;         } else {           if (Q[1][0] && Q[1][0] != Q[0][0]) {             res.emplace_back(Q[1][x], 3, 1);             Q[2][0] = Q[1][0];             Q[1][0] = 0;           }           y = !y;         }       } else {         if (Q[1 + y][x]) {           res.emplace_back(Q[1 + y][x], 1, x + 1);           Q[1 + y][x] = 0;           count--;         } else if (x < n - 1) {           if (Q[1 + y][x + 1] && Q[1 + y][x + 1] != Q[0][x + 1]) {             res.emplace_back(Q[1 + y][x + 1], 2, x + 1);             Q[1 + y][x] = Q[1 + y][x + 1];             Q[1 + y][x + 1] = 0;           }           x++;         } else {           if (Q[2][n - 1] && Q[2][n - 1] != Q[3][n - 1]) {             res.emplace_back(Q[2][n - 1], 2, n);             Q[1][n - 1] = Q[2][n - 1];             Q[2][n - 1] = 0;           }           y = !y;         }       }     }     printf( %d n , (int)res.size());     fflush(stdout);     int a, b, c;     for (auto i : res) {       tie(a, b, c) = i;       printf( %d %d %d n , a, b, c);     }     return 0;   }