#include<iostream>
#include<stdio.h>
#include<map>
#include<stack>
#include<queue>
#include<algorithm>
#define maxn 2100005
#define maxm 1000005
using namespace std;
int n,r,c;
struct edge{
int to,next;
}e[maxm],en[maxm];
int head[maxn],cnt;
inline void add(int u,int v){
e[++cnt]={v,head[u]};
head[u]=cnt;
}
int headn[maxn],cntn;
inline void addn(int u,int v){
en[++cntn]={v,headn[u]};
headn[u]=cntn;
}
struct node{
int x,y;
bool operator < (const node &a)const{return a.x<x||(a.x==x&&a.y<y);}
};
struct door{
int typ,num;
};
map<node,door> mp;
int xx[8]={-1,-1,0,1,1,1,0,-1},yy[8]={0,-1,-1,-1,0,1,1,1};
int dfn[maxn],low[maxn],ind,color,belong[maxn],val[maxn];
bool vis[maxn];
stack<int> s;
void tar(int u){
vis[u]=1;
s.push(u);
dfn[u]=low[u]=++ind;
for(int i=head[u];i;i=e[i].next){
int v=e[i].to;
if(dfn[v]==0){
tar(v);
low[u]=min(low[u],low[v]);
}
if(vis[v]) low[u]=min(low[u],low[v]);
}
if(dfn[u]==low[u]){
color++;
int t=-1;
while(t!=u){
t=s.top();s.pop();
vis[t]=0;belong[t]=color;
if(t>r+c) val[color]++;
}
}
}
int in[maxn],dp[maxn],ans=-0x7fffffff;
queue<int> q;
void topo(){
for(int i=1;i<=color;i+=1){
if(in[i]==0){
q.push(i);
dp[i]=val[i];
}
}
while(!q.empty()){
int x=q.front();q.pop();
for(int i=headn[x];i;i=en[i].next){
int y=en[i].to;
in[y]--;
dp[y]=max(dp[y],dp[x]+val[y]);
if(in[y]==0){
q.push(y);
}
}
}
for(int i=1;i<=color;i+=1) ans=max(ans,dp[i]);
}
struct no{
int x,y,typ;
}a[maxn];
bool cmp(no a,no b){
if(a.typ==b.typ){
if(a.x==b.x) return a.y<b.y;
return a.x<b.x;
}
return a.typ<b.typ;
}
int main(){
cin>>n>>r>>c;
int x,y,typ;
for(int i=1;i<=n;i+=1) scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].typ);
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i+=1){
x=a[i].x,y=a[i].y,typ=a[i].typ;
add(x,i+c+r);
add(y+r,i+c+r);
if(typ==1){
add(i+c+r,x);
mp[{x,y}]={1,i+c+r};
}
else if(typ==2){
add(i+c+r,y+r);
mp[{x,y}]={2,i+c+r};
}
else{
int tmpx=x,tmpy=y;
mp[{x,y}]={3,r+c+i};
for(int j=0;j<8;j+=1){
door tmp=mp[{tmpx+xx[j],tmpy+yy[j]}];
if(tmp.num!=0&&1<=tmpx+xx[j]&&r>=tmpx+xx[j]&&1<=tmpy+yy[j]&&c>=tmpy+yy[j]){
add(r+c+i,tmp.num);
}
}
}
}
for(int i=1;i<=r+c+n;i+=1) if(dfn[i]==0) tar(i);
for(int i=1;i<=r+c+n;i+=1){
for(int j=head[i];j;j=e[j].next){
int v=e[j].to;
if(belong[i]==belong[v]) continue;
addn(belong[i],belong[v]);
in[belong[v]]++;
}
}
topo();
cout<<ans;
return 0;
}