#include <bits/stdc++.h>
using namespace std;
const int maxn = 55;
int n, m, cnd, table[maxn][maxn], satr = 1, dx[] = {-1, 1, 0, 0},
                                  dy[] = {0, 0, -1, 1}, cnt = 1,
                                  dis[maxn][maxn], hw[maxn][maxn];
pair<int, int> dad[maxn][maxn];
struct point {
  int x, y, xf, yf;
  point(int a = 0, int b = 0, int c = 0, int d = 0) {
    x = a, y = b, xf = c, yf = d;
  }
} pt[maxn];
vector<point> ans;
vector<pair<int, int>> row[maxn];
void mv(int i, int dir) {
  if (dir < 0) cout << "WTFFF" << endl;
  point res;
  res.x = pt[i].x, res.y = pt[i].y;
  table[pt[i].x][pt[i].y] = 0;
  pt[i].x += dx[dir], pt[i].y += dy[dir];
  table[pt[i].x][pt[i].y] = i;
  res.xf = pt[i].x, res.yf = pt[i].y;
  ans.push_back(res);
}
void op2(int j) {
  if (j == n)
    mv(table[satr][j], 2), cnd = j - 1;
  else
    mv(table[satr][j], 3);
}
void cclean(int j) {
  int up = satr, down = satr;
  while (up > 0 && table[up][j] != 0) up--;
  while (down <= n && table[down][j] != 0) down++;
  if (up == 0 && down == n + 1)
    op2(j);
  else if (up != 0) {
    up++;
    while (up <= satr) mv(table[up][j], 0), up--;
  } else {
    down--;
    while (down >= satr) mv(table[down][j], 1), down--;
  }
}
void clean() {
  for (int i = 1; i <= n; i++)
    if (table[satr][i] != 0) cclean(i);
}
void bfs(int x, int y) {
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++) dis[i][j] = (1 << 20), hw[i][j] = -1;
  dis[x][y] = 0;
  queue<pair<int, int>> q;
  q.push({x, y});
  while (!q.empty()) {
    auto t = q.front();
    q.pop();
    for (int i = 0; i < 4; i++) {
      int xf = t.first + dx[i], yf = t.second + dy[i];
      if (xf > 0 && xf <= n && yf > 0 && yf <= n && table[xf][yf] == 0 &&
          dis[xf][yf] > dis[t.first][t.second] + 1)
        dis[xf][yf] = dis[t.first][t.second] + 1, hw[xf][yf] = i,
        dad[xf][yf] = t, q.push({xf, yf});
    }
  }
}
void p(int i, int j) {
  if (dis[i][j] != 0) {
    p(dad[i][j].first, dad[i][j].second);
    mv(table[dad[i][j].first][dad[i][j].second], hw[i][j]);
  }
}
int bfs2() {
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++) dis[i][j] = (1 << 20);
  dis[satr][cnt] = 0;
  queue<pair<int, int>> q;
  q.push({satr, cnt});
  while (!q.empty()) {
    auto t = q.front();
    q.pop();
    for (int i = 0; i < 4; i++) {
      int xf = t.first + dx[i], yf = t.second + dy[i];
      if (xf > 0 && xf <= n && yf > 0 && yf <= n) {
        if (table[xf][yf] != 0 && xf != satr) return table[xf][yf];
        if (table[xf][yf] == 0 && dis[xf][yf] > dis[t.first][t.second] + 1)
          dis[xf][yf] = dis[t.first][t.second] + 1, q.push({xf, yf});
      }
    }
  }
  return 0;
}
void move(int id, int i, int j) {
  bfs(pt[id].x, pt[id].y);
  p(i, j);
}
int main() {
  cin >> n >> m;
  if (n == 1) return cout << 0 << endl, 0;
  for (int i = 1; i <= m; i++) {
    cin >> pt[i].x >> pt[i].y;
    table[pt[i].x][pt[i].y] = i;
  }
  for (int i = 1; i <= m; i++) {
    cin >> pt[i].xf >> pt[i].yf;
    row[pt[i].xf].push_back({pt[i].yf, i});
  }
  for (int i = 1; i <= n; i++) sort(row[i].begin(), row[i].end());
  clean();
  if (cnd) cclean(cnd);
  while (cnt <= m) move(bfs2(), satr, cnt), cnt++;
  clean();
  if (cnd) cclean(cnd);
  cnt = 1;
  for (auto u : row[satr]) move(u.second, satr, cnt), cnt++;
  for (auto u : row[2]) move(u.second, satr, cnt), cnt++;
  while (cnt <= m) move(bfs2(), satr, cnt), cnt++;
  for (int i = n; i >= 1; i--)
    if (i != satr)
      for (int j = 0; j < row[i].size(); j++)
        move(row[i][j].second, pt[row[i][j].second].xf,
             pt[row[i][j].second].yf);
  for (int j = row[satr].size() - 1; j > -1; j--)
    move(row[satr][j].second, pt[row[satr][j].second].xf,
         pt[row[satr][j].second].yf);
  cout << ans.size() << endl;
  for (auto u : ans)
    cout << u.x << ' ' << u.y << ' ' << u.xf << ' ' << u.yf << '\n';
}
