#include <bits/stdc++.h>
using namespace std;
const int N = 1010,M = 2 * N * N;
int n,m,cnt;
int p[N*N],id[N][N];
struct Edge {
int a,b,w;
}edge[M];
int dx[]={-1,0,1,0},dy[]={0,1,0,-1},dw[]={1,2,1,2};
int find(int x) {
if(p[x] != x) p[x] = find(p[x]);
return p[x];
}
void solve() {
for(int z = 0; z < 2; z ++)
for(int i = 1; i <= n; i ++)
for (int j = 1; j <= m; j ++)
for (int u = 0; u < 4; u ++) {
if(u % 2 == z) {
int x = i+dx[u],y = j+dy[u],w = dw[u];
if(x&&x<=n&&y&&y<=m) {
int a = id[i][j],b = id[x][y];
if(a < b) edge[cnt++] = {a,b,w};
}
}
}
}
int main() {
int t = 1;
cin >> n >> m;
for (int i = 1; i <= n; i ++) {
for (int j = 1; j <= m; j ++) id[i][j] = t++;
}
for (int i = 1; i <= t; i ++) p[i] = i;
int x1,y1,x2,y2;
while(cin>>x1>>y1>>x2>>y2) {
int a = id[x1][y1],b = id[x2][y2];
p[find(a)] = find(b);
}
solve();
int res = 0;
for (int i = 0; i < cnt; i ++) {
int a = find(edge[i].a),b = find(edge[i].b),w = edge[i].w;
if(a != b) {
p[a] = b;
res += w;
}
}
cout << res << endl;
return 0;
}