#include <bits/stdc++.h>
using namespace std;
struct Node {
  int x, y, xx, yy;
  void print(bool inverse = false) {
    if (inverse)
      printf("%d %d %d %d\n", xx, yy, x, y);
    else
      printf("%d %d %d %d\n", x, y, xx, yy);
  }
};
struct Node2 {
  int x, y, id, rankk;
};
vector<Node> ans[2];
Node2 a[55];
int used[55];
int n, m, id;
void mov(int id2, int tar, int dir) {
  if (dir) {
    if (a[id2].y < tar) {
      for (int i = a[id2].y; i < tar; i++)
        ans[id].push_back((Node){a[id2].x, i, a[id2].x, i + 1});
    } else {
      for (int i = a[id2].y; i > tar; i--)
        ans[id].push_back((Node){a[id2].x, i, a[id2].x, i - 1});
    }
    a[id2].y = tar;
  } else {
    if (a[id2].x < tar) {
      for (int i = a[id2].x; i < tar; i++)
        ans[id].push_back((Node){i, a[id2].y, i + 1, a[id2].y});
    } else {
      for (int i = a[id2].x; i > tar; i--)
        ans[id].push_back((Node){i, a[id2].y, i - 1, a[id2].y});
    }
    a[id2].x = tar;
  }
}
void dfs(int id2) {
  if (id2 < m && a[id2 + 1].y == a[id2].y && a[id2 + 1].x <= a[id2].rankk)
    dfs(id2 + 1);
  mov(id2, a[id2].rankk, 0);
  used[id2] = 1;
}
void solve() {
  for (int i = 1; i <= m; i++) {
    scanf("%d %d", &a[i].x, &a[i].y);
    a[i].id = i;
  }
  sort(a + 1, a + m + 1, [&](Node2 x, Node2 y) {
    if (x.x == y.x) return x.y < y.y;
    return x.x < y.x;
  });
  for (int i = 1; i <= m; i++) a[i].rankk = i;
  sort(a + 1, a + m + 1, [&](Node2 x, Node2 y) {
    if (x.y == y.y) return x.x < y.x;
    return x.y < y.y;
  });
  memset(used, 0, sizeof(used));
  for (int i = 1; i <= m; i++) {
    if (!used[i]) dfs(i);
  }
  for (int i = 1; i <= m; i++) mov(i, a[i].id, 1);
  for (int i = 1; i <= m; i++) mov(i, a[i].id, 0);
}
int main() {
  scanf("%d %d", &n, &m);
  id = 0;
  solve();
  id = 1;
  solve();
  printf("%d\n", (int)ans[0].size() + (int)ans[1].size());
  for (int i = 0; i < (int)ans[0].size(); i++) ans[0][i].print();
  if ((int)ans[1].size()) {
    for (int i = (int)ans[1].size() - 1; i >= 0; i--) ans[1][i].print(true);
  }
  return 0;
}
