#11~14 WA #15 TLE #16~20 RE
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
const int M=2e7+5;
const int inf=1e9;
int n,m,k,s,t;
int num[N<<3],cur[N<<3],tot;
struct Edge{
int end,nxt,flow;
void add(int u,int v,int w){
end=v;
nxt=num[u];
num[u]=tot;
flow=w;
}
}E[M];
int d[N<<3];bool vis[N<<3];
bool bfs(){
memset(d,0,sizeof d);
queue<int>q;
d[s]=1;
q.push(s);
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=num[u];~i;i=E[i].nxt){
int v=E[i].end,w=E[i].flow;
if(!d[v]&&w){
d[v]=d[u]+1;
q.push(v);
if(v==t){
return 1;
}
}
}
}
return 0;
}
int dfs(int u,int flow){
if(u==t){
return flow;
}
int res=flow;
for(int &i=cur[u];~i&&res;i=E[i].nxt){
int v=E[i].end,w=E[i].flow;
if(d[v]==d[u]+1&&w){
int k=dfs(v,min(w,res));
if(!k){
d[v]=0;
}
E[i].flow-=k;
E[i^1].flow+=k;
res-=k;
}
}
return flow-res;
}
int dinic(){
int maxflow=0;
while(bfs()){
memcpy(cur,num,sizeof cur);
maxflow+=dfs(s,inf);
}
return maxflow;
}
struct node{
int ch[2];
}tr[N<<3];
int rt[2],idx;
int a[N][2];
void addDouble(int u,int v,int w){
E[++tot].add(u,v,w);
E[++tot].add(v,u,0);
}
struct segTree{
#define lc tr[i].ch[0]
#define rc tr[i].ch[1]
#define mid (l+r)/2
void build(int &i,int l,int r,int opt){
i=++idx;
if(l==r){
a[l][opt]=i;
return;
}
build(lc,l,mid,opt);
build(rc,mid+1,r,opt);
if(opt==0){
addDouble(lc,i,inf);
addDouble(rc,i,inf);
}else{
addDouble(i,lc,inf);
addDouble(i,rc,inf);
}
}
void Link(int i,int l,int r,int L,int R,vector<int>&lnk){
if(L<=l&&R>=r){
lnk.push_back(i);
return;
}
if(L<=mid){
Link(lc,l,mid,L,R,lnk);
}
if(R>mid){
Link(rc,mid+1,r,L,R,lnk);
}
}
#undef lc
#undef rc
#undef mid
}sgt[2];
int main(){
memset(num,-1,sizeof num);
tot=-1;
scanf("%d%d%d",&n,&m,&k);
sgt[0].build(rt[0],1,k,0);
sgt[1].build(rt[1],1,k,1);
for(int i=1;i<=n;i++){
addDouble(a[i][1],a[i][0],inf);
}
s=++idx,t=++idx;
addDouble(s,a[1][0],n);
addDouble(a[k][1],t,n);
vector<int>lnk0,lnk1;
for(int i=1;i<=m;i++){
lnk0.clear(),lnk1.clear();
int u=++idx,v=++idx;
int opt,lmt,a1,a2,b1,b2;
scanf("%d%d",&opt,&lmt);
if(opt==1){
scanf("%d%d",&a1,&b1);
sgt[0].Link(rt[0],1,k,a1,a1,lnk0);
sgt[1].Link(rt[1],1,k,b1,b1,lnk1);
}else if(opt==2){
scanf("%d%d%d",&a1,&a2,&b1);
sgt[0].Link(rt[0],1,k,a1,a2,lnk0);
sgt[1].Link(rt[1],1,k,b1,b1,lnk1);
}else if(opt==3){
scanf("%d%d%d",&a1,&b1,&b2);
sgt[0].Link(rt[0],1,k,a1,a1,lnk0);
sgt[1].Link(rt[1],1,k,b1,b2,lnk1);
}else if(opt==4){
scanf("%d%d%d%d",&a1,&a2,&b1,&b2);
sgt[0].Link(rt[0],1,k,a1,a2,lnk0);
sgt[1].Link(rt[1],1,k,b1,b2,lnk1);
}
addDouble(u,v,lmt);
for(auto p0:lnk0){
for(auto p1:lnk1){
// printf("%d and %d\n",p0,p1);
addDouble(p0,u,inf);
addDouble(v,p1,inf);
}
}
}
printf("%d\n",dinic());
return 0;
}