#include <bits/stdc++.h>
using namespace std;
const int N = 55;
typedef class Point {
 public:
  int x, y;
  Point(int x = 0, int y = 0) : x(x), y(y) {}
  bool operator<(Point b) const {
    if (x ^ b.x) return x < b.x;
    return y < b.y;
  }
} Point;
void readPoint(Point& p) { scanf("%d%d", &p.x, &p.y); }
int n, m;
bool used[N][N], sec[N];
Point ps[N], pt[N];
pair<Point, int> buf[N], bs[N];
int place[N], rk[N], put[N];
inline void init() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= m; i++) {
    readPoint(ps[i]);
    bs[i] = make_pair(ps[i], i);
    if (ps[i].x == ps[i].y && ps[i].x <= m) place[ps[i].x] = i, sec[i] = true;
    ((used)[ps[i].x][ps[i].y]) = true;
  }
  for (int i = 1; i <= m; i++) {
    readPoint(pt[i]);
    buf[i] = make_pair(pt[i], i);
  }
}
const int mov[4][2] = {{0, 1}, {1, 0}, {-1, 0}, {0, -1}};
bool inq[N][N];
Point ls[N][N];
queue<Point> que;
bool arrivable(Point s, Point t) {
  memset(inq, false, sizeof(inq));
  inq[s.x][s.y] = true;
  que.push(s);
  while (!que.empty()) {
    Point e = que.front();
    que.pop();
    for (int k = 0; k < 4; k++) {
      Point eu(e.x + mov[k][0], e.y + mov[k][1]);
      if (eu.x < 1 || eu.x > n || eu.y < 1 || eu.y > n) continue;
      if (used[eu.x][eu.y] || inq[eu.x][eu.y]) continue;
      ls[eu.x][eu.y] = e;
      inq[eu.x][eu.y] = true;
      que.push(eu);
    }
  }
  return inq[t.x][t.y];
}
vector<pair<Point, Point> > path;
void printPath(Point cur, Point s) {
  if (cur.x == s.x && cur.y == s.y) return;
  Point nx = ls[cur.x][cur.y];
  printPath(nx, s);
  path.push_back(pair<Point, Point>(nx, cur));
}
bool move(Point start, Point end) {
  if (!arrivable(start, end)) return false;
  printPath(end, start);
  ((used)[start.x][start.y]) = false;
  ((used)[end.x][end.y]) = true;
  return true;
}
void swapPoint(int a, int b) {
  move(Point(a, a), Point(a, b));
  move(Point(b, b), Point(a, a));
  move(Point(a, b), Point(b, b));
  swap(place[a], place[b]);
}
int cnt[N];
bool finished[N];
inline void solve() {
  sort(bs + 1, bs + m + 1);
  sort(buf + 1, buf + m + 1);
  for (int i = 1; i <= m; i++) rk[buf[i].second] = i;
  for (int i = 1; i <= m; i++) {
    if (place[i]) continue;
    bool aflag = false;
    for (int k = 1; k <= m && !aflag; k++) {
      int j = bs[k].second;
      if (!sec[j] && move(ps[j], Point(i, i))) {
        ps[j] = Point(i, i);
        place[i] = j, sec[j] = true;
      }
    }
  }
  for (int i = 1; i <= m; i++) {
    int pos = 0;
    for (int j = i; j <= m; j++)
      if (rk[place[j]] == i) {
        pos = j;
        break;
      }
    if (pos ^ i) swapPoint(i, pos);
  }
  for (int i = 1; i <= m; i++) {
    int x = buf[i].first.x;
    move(Point(i, i), Point(x, ++cnt[x]));
    ps[buf[i].second] = Point(x, cnt[x]);
  }
  for (int i = m; i; i--) move(ps[buf[i].second], buf[i].first);
  printf("%d\n", (signed)path.size());
  for (int i = 0; i < (signed)path.size(); i++)
    printf("%d %d %d %d\n", path[i].first.x, path[i].first.y, path[i].second.x,
           path[i].second.y);
}
int main() {
  srand(233u);
  init();
  solve();
  return 0;
}
