#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
#define x first
#define y second
#define bg begin()
#define ed end()
#define pb push_back
#define mp make_pair
#define sz(a) int((a).size())
#define R(i,n) for(int i(0);i<(n);++i)
#define L(i,n) for(int i((n)-1);~i;--i)
const int iinf=0x3f3f3f3f;
const ll linf=0x3f3f3f3f3f3f3f3f;
//Data
const int N=50;
int n,m,lv[N],rv[N];
//Flows
const int fN=N*2+2;
int fn,s,t;
vector<int> e[fN],to,fw,co;
void adde(int u,int v,int w,int c){
// cout<<u<<" "<<v<<" "<<w<<" "<<c<<'\n';
e[u].pb(sz(to)),to.pb(v),fw.pb(w),co.pb(+c);
e[v].pb(sz(to)),to.pb(u),fw.pb(0),co.pb(-c);
}
int pre[fN],dep[fN];
bool vis[fN];
queue<int> q;
bool spfa(){
R(u,fn) pre[u]=-1,dep[u]=iinf,vis[u]=false;
q.push(pre[s]=s),dep[s]=0,vis[s]=true;
while(sz(q)){
int u=q.front(); q.pop(),vis[u]=false;
for(int v:e[u])if(fw[v]&&dep[to[v]]>dep[u]+co[v])
dep[to[v]]=dep[u]+co[v],pre[to[v]]=v,
(!vis[to[v]])&&(q.push(to[v]),vis[to[v]]=true);
}
return dep[t]^iinf;
}
pair<int,int> flow(){
pair<int,int> res(0,0);
while(spfa()){
int f=iinf;
for(int u=t;u^s;u=to[pre[u]^1])
f=min(f,fw[pre[u]]);
for(int u=t;u^s;u=to[pre[u]^1])
fw[pre[u]]-=f,fw[pre[u]^1]+=f;
res.x+=f,res.y+=dep[t]*f;
}
return res;
}
//Main
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>m,fn=(t=(s=n<<1)+1)+1;
R(i,n) lv[i]=0,rv[i]=n-1;
R(i,m){
int o,l,r,v; cin>>o>>l>>r>>v,--v,--o,--l;
R(j,r-l)if(o) rv[l+j]=min(rv[l+j],v);
else lv[l+j]=max(lv[l+j],v);
}
R(i,n)if(lv[i]>=++rv[i]) cout<<-1<<'\n',exit(0);
R(i,n){
adde(s,i,1,0);
R(j,rv[i]-lv[i]) adde(i,j+lv[i]+n,1,0);
R(j,n) adde(i+n,t,1,2*j+1);
}
cout<<flow().y<<'\n';
return 0;
}