#include <bits/stdc++.h>
using std::pair;
using std::queue;
const int N = 2e4 + 10, T = 5e5 + 10, M = 2e6 + 10, inf = 0x3f3f3f3f;
int n, q, s, t, tot, E = 1, H[T], dep[T], nxt[M], to[M], edg[M];
int ls[T], rs[T], pos[2][N], rt[2], id[T], las[N];
pair<pair<int, int>, int> ln[T];
void add(int x, int y, int z = inf) {
  ++E, to[E] = y, nxt[E] = H[x], edg[E] = z, H[x] = E;
  ++E, to[E] = x, nxt[E] = H[y], edg[E] = 0, H[y] = E;
}
bool bfs() {
  for (int i = 1; i <= tot; i++) dep[i] = 0;
  queue<int> q;
  q.push(s);
  dep[s] = 1;
  while (q.size()) {
    int x = q.front();
    q.pop();
    for (int i = H[x]; i; i = nxt[i]) {
      if (!edg[i] || dep[to[i]]) continue;
      dep[to[i]] = dep[x] + 1;
      q.push(to[i]);
    }
  }
  return dep[t] != 0;
}
int dfs(int x, int flow) {
  if (x == t) return flow;
  int las = flow;
  for (int i = H[x]; i && las; i = nxt[i]) {
    if (dep[to[i]] != dep[x] + 1 || !edg[i]) continue;
    int k = dfs(to[i], std::min(las, edg[i]));
    if (!k) dep[to[i]] = 0;
    las -= k, edg[i] -= k, edg[i ^ 1] += k;
  }
  return flow - las;
}
void build(int p, int l, int r, int o) {
  if (l == r) return pos[o][l] = p, void();
  int mid = (l + r) >> 1;
  ls[p] = ++tot, rs[p] = ++tot;
  build(ls[p], l, mid, o), build(rs[p], mid + 1, r, o);
  if (o)
    add(p, ls[p]), add(p, rs[p]);
  else
    add(ls[p], p), add(rs[p], p);
}
void out(int p, int l, int r, int L, int R, int x) {
  if (L <= l && r <= R) return add(p, x);
  int mid = (l + r) >> 1;
  if (L <= mid) out(ls[p], l, mid, L, R, x);
  if (mid < R) out(rs[p], mid + 1, r, L, R, x);
}
void in(int p, int l, int r, int L, int R, int x) {
  if (L <= l && r <= R) return add(x, p);
  int mid = (l + r) >> 1;
  if (L <= mid) in(ls[p], l, mid, L, R, x);
  if (mid < R) in(rs[p], mid + 1, r, L, R, x);
}
bool cmp(int a, int b) {
  return ln[a].second == ln[b].second ? (a & 1) <= (b & 1)
                                      : ln[a].second < ln[b].second;
}
void Mtr(int x1, int x2, int y1, int y2) {
  assert(x1 <= x2 && y1 <= y2);
  ++tot;
  out(rt[0], 1, n, x1, x2, tot);
  in(rt[1], 1, n, y1, y2, tot);
}
signed main() {
  std::cin >> n >> q;
  build(rt[0] = ++tot, 1, n, 0);
  build(rt[1] = ++tot, 1, n, 1);
  s = ++tot, t = ++tot;
  for (int i = 1; i <= n; i++)
    add(s, pos[0][i], 1), add(pos[1][i], t, 1), las[i] = 1;
  int All = 0;
  for (int i = 1, o; i <= q; i++) {
    int x1, y1, x2, y2;
    scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
    All++, id[All] = All,
           ln[All] = pair<pair<int, int>, int>(pair<int, int>(x1, x2), y1);
    All++, id[All] = All,
           ln[All] = pair<pair<int, int>, int>(pair<int, int>(x1, x2), y2 + 1);
  }
  All++, id[All] = All,
         ln[All] = pair<pair<int, int>, int>(pair<int, int>(1, n), n + 1);
  std::sort(id + 1, id + All + 1, cmp);
  for (int i = 1; i <= All; i++) {
    pair<pair<int, int>, int> o = ln[id[i]];
    if (id[i] & 1) {
      for (int l = o.first.first, r; l <= o.first.second; l = r) {
        r = l;
        while (las[r] == las[l] && r <= o.first.second) r++;
        if (o.second > las[l]) Mtr(l, r - 1, las[l], o.second - 1);
      }
    } else
      for (int p = o.first.first; p <= o.first.second; p++) las[p] = o.second;
  }
  int ans = 0;
  while (bfs()) ans += dfs(s, inf);
  std::cout << ans;
  return 0;
}
