#include <iostream>
#include <vector>
#include <queue>
using namespace std;
#define MAXN 100
struct node {
int x;
int y;
};
vector<node> v[MAXN][MAXN];
bool visited[MAXN][MAXN];
int used[MAXN][MAXN];
int N, M;
int idx = 0;
int dx[] = { 0,0,1,-1 };
int dy[] = { 1,-1,0,0 };
bool is_range(int x, int y) {
if (x < 0 || y < 0 || x >= N || y >= N) return false;
return true;
}
bool is_connected(int x, int y) {
for (int k = 0; k < 4; k++) {
int nx = x + dx[k];
int ny = y + dy[k];
if (!is_range(nx, ny)) continue;
if (visited[nx][ny]) return 1;
}
return 0;
}
int bfs() {
queue<pair<int,int> > q;
q.push({ 0,0 });
visited[0][0] = true;
used[0][0] = true;
int ans = 0;
while (!q.empty()){
int x = q.front().first;
int y = q.front().second;
q.pop();
for (int i = 0; i < v[x][y].size(); i++) {
int nx = v[x][y][i].x;
int ny = v[x][y][i].y;
if (visited[nx][ny]) continue;
if (is_connected(nx, ny)) {
visited[nx][ny] = true;
q.push({ nx,ny });
}
used[nx][ny] = true;
}
for (int k = 0; k < 4; k++) {
int nx = x + dx[k];
int ny = y + dy[k];
if (!is_range(nx, ny)) continue;
if (!used[nx][ny] || visited[nx][ny]) continue;
visited[nx][ny] = true;
q.push({ nx,ny });
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
ans += (int)used[i][j];
}
}
return ans;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cin >> N >> M;
for (int i = 0; i < M; i++) {
int x1, y1, x2, y2;
cin >> x1 >> y1 >> x2 >> y2;
x1--;
y1--;
x2--;
y2--;
v[x1][y1].push_back({ x2,y2 });
}
cout << bfs() <<"\n";
return 0;
}