#include <bits/stdc++.h>
using namespace std;
const int N = 100;
int x[N], y[N], fx[N], fy[N];
int grid[N][N], dist[N][N];
pair<int, int> pai[N][N];
int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, -1, 0, 1};
vector<pair<pair<int, int>, pair<int, int> > > ans;
void add(pair<int, int> a, pair<int, int> b) { ans.push_back({a, b}); }
bool cmp(int i, int j) {
  if (x[i] != x[j]) return x[i] < x[j];
  return y[i] < y[j];
}
bool cmp2(int i, int j) {
  if (fx[i] != fx[j]) return fx[i] > fx[j];
  return fy[i] < fy[j];
}
bool cmp3(int i, int j) {
  if (fx[i] != fx[j]) return fx[i] > fx[j];
  return fy[i] > fy[j];
}
int main(void) {
  int n, m;
  scanf("%d %d", &n, &m);
  for (int i = 1; i <= m; i++) scanf("%d %d", x + i, y + i);
  for (int i = 1; i <= m; i++) scanf("%d %d", fx + i, fy + i);
  for (int i = 1; i <= m; i++) grid[x[i]][y[i]] = i;
  vector<int> p;
  for (int i = 1; i <= m; i++) p.push_back(i);
  sort(p.begin(), p.end(), cmp);
  int ppp = 1;
  set<int> s;
  int ct = m;
  while (ct) {
    for (int j = 0; j < m; j++) {
      int i = ppp - 1;
      int id = p[j];
      if (s.count(id)) continue;
      memset(dist, -1, sizeof dist);
      dist[x[id]][y[id]] = 0;
      queue<pair<int, int> > q;
      q.push({x[id], y[id]});
      while (!q.empty()) {
        int x, y;
        tie(x, y) = q.front();
        q.pop();
        for (int k = 0; k < 4; k++) {
          int xx = x + dx[k], yy = y + dy[k];
          if (xx >= 1 and xx <= n and yy >= 1 and yy <= n) {
            if (dist[xx][yy] != -1 or grid[xx][yy]) continue;
            dist[xx][yy] = dist[x][y] + 1;
            pai[xx][yy] = make_pair(x, y);
            q.push({xx, yy});
          }
        }
      }
      if (dist[1][i + 1] == -1) continue;
      s.insert(id);
      ct--;
      ppp++;
      vector<pair<int, int> > path;
      int xx = 1, yy = i + 1;
      while (true) {
        path.push_back({xx, yy});
        if (xx == x[id] and yy == y[id]) break;
        int ax, ay;
        tie(ax, ay) = pai[xx][yy];
        xx = ax;
        yy = ay;
      }
      reverse(path.begin(), path.end());
      grid[x[id]][y[id]] = 0;
      grid[1][i + 1] = id;
      x[id] = 1;
      y[id] = i + 1;
      for (int i = 1; i < path.size(); i++) add(path[i - 1], path[i]);
    }
  }
  for (int i = n - 1; i >= 0; i--) {
    if (grid[1][i] == 0) continue;
    for (int j = i; j < n; j++) {
      if (grid[1][j + 1]) break;
      add(make_pair(1, j), make_pair(1, j + 1));
      swap(grid[1][j], grid[1][j + 1]);
      y[grid[1][j + 1]] = j + 1;
    }
  }
  vector<int> a, b, c;
  for (int i = 1; i <= m; i++)
    if (fx[i] == 1) a.push_back(i);
  for (int i = 1; i <= m; i++)
    if (fx[i] == 2) b.push_back(i);
  for (int i = 1; i <= m; i++)
    if (fx[i] >= 3) c.push_back(i);
  sort(c.begin(), c.end(), cmp2);
  sort(a.begin(), a.end(), cmp2);
  sort(b.begin(), b.end(), cmp3);
  p.clear();
  for (auto it : c) p.push_back(it);
  for (auto it : b) p.push_back(it);
  for (auto it : a) p.push_back(it);
  int quero = n - m + 1;
  for (int i = 0; i < m; i++) {
    int id = p[i];
    if (y[id] == quero + i) continue;
    add(make_pair(1, y[id]), make_pair(2, y[id]));
    int go_to = i + 1;
    for (int x = y[id] - 1; x >= quero + i; x--) {
      add(make_pair(1, x), make_pair(1, x + 1));
      grid[1][x + 1] = grid[1][x];
      y[grid[1][x]] = x + 1;
      add(make_pair(2, x + 1), make_pair(2, x));
    }
    add(make_pair(2, quero + i), make_pair(1, quero + i));
    grid[1][quero + i] = id;
    y[id] = quero + i;
  }
  for (int i = 0; i < m; i++) {
    int id = p[i];
    memset(dist, -1, sizeof dist);
    dist[x[id]][y[id]] = 0;
    queue<pair<int, int> > q;
    q.push({x[id], y[id]});
    while (!q.empty()) {
      int x, y;
      tie(x, y) = q.front();
      q.pop();
      for (int k = 0; k < 4; k++) {
        int xx = x + dx[k], yy = y + dy[k];
        if (xx >= 1 and xx <= n and yy >= 1 and yy <= n) {
          if (dist[xx][yy] != -1 or grid[xx][yy]) continue;
          dist[xx][yy] = dist[x][y] + 1;
          pai[xx][yy] = make_pair(x, y);
          q.push({xx, yy});
        }
      }
    }
    assert(dist[fx[id]][fy[id]] != -1);
    vector<pair<int, int> > path;
    int xx = fx[id], yy = fy[id];
    while (true) {
      path.push_back({xx, yy});
      if (xx == x[id] and yy == y[id]) break;
      int ax, ay;
      tie(ax, ay) = pai[xx][yy];
      xx = ax;
      yy = ay;
    }
    reverse(path.begin(), path.end());
    grid[x[id]][y[id]] = 0;
    grid[fx[id]][fy[id]] = id;
    x[id] = 1;
    y[id] = i + 1;
    for (int i = 1; i < path.size(); i++) add(path[i - 1], path[i]);
  }
  cout << ans.size() << endl;
  for (auto pp : ans)
    cout << pp.first.first << " " << pp.first.second << " " << pp.second.first
         << " " << pp.second.second << endl;
  return 0;
}
