#include <bits/stdc++.h>
using namespace std;
const int MAXN = 55;
const int dir[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
struct Point {
  int x, y, id;
  Point() = default;
  Point(int _x, int _y) : x(_x), y(_y) {}
  bool operator<(const Point &t) const { return x < t.x; }
  Point Move(int d) { return Point(x + dir[d][0], y + dir[d][1]); }
  void Go(int d) { x += dir[d][0], y += dir[d][1]; }
};
int n, m;
vector<pair<Point, Point>> path1, path2;
Point A[MAXN], B[MAXN];
void solve(Point A[], vector<pair<Point, Point>> &ans) {
  sort(A + 1, A + m + 1);
  for (int i = 1; i <= m; i++)
    while (A[i].x > i) {
      ans.push_back(make_pair(A[i], A[i].Move(0)));
      A[i].Go(0);
    }
  for (int i = m; i >= 1; i--)
    while (A[i].x < i) {
      ans.push_back(make_pair(A[i], A[i].Move(2)));
      A[i].Go(2);
    }
  for (int i = 1; i <= m; i++) {
    while (A[i].y > A[i].id) {
      ans.push_back(make_pair(A[i], A[i].Move(3)));
      A[i].Go(3);
    }
    while (A[i].y < A[i].id) {
      ans.push_back(make_pair(A[i], A[i].Move(1)));
      A[i].Go(1);
    }
  }
  for (int i = 1; i <= m; i++) {
    while (A[i].x > A[i].id) {
      ans.push_back(make_pair(A[i], A[i].Move(0)));
      A[i].Go(0);
    }
    while (A[i].x < A[i].id) {
      ans.push_back(make_pair(A[i], A[i].Move(2)));
      A[i].Go(2);
    }
  }
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= m; i++) {
    scanf("%d%d", &A[i].x, &A[i].y);
    A[i].id = i;
  }
  for (int i = 1; i <= m; i++) {
    scanf("%d%d", &B[i].x, &B[i].y);
    B[i].id = i;
  }
  solve(A, path1);
  solve(B, path2);
  printf("%u\n", path1.size() + path2.size());
  for (auto p = path1.begin(); p != path1.end(); p++)
    printf("%d %d %d %d\n", p->first.x, p->first.y, p->second.x, p->second.y);
  for (auto p = path2.rbegin(); p != path2.rend(); p++)
    printf("%d %d %d %d\n", p->second.x, p->second.y, p->first.x, p->first.y);
  return 0;
}
