#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<vector>
#include<cmath>
#include<queue>
#include<map>
#define ll long long
using namespace std;
inline ll max(ll x,ll y){return x>y?x:y;}
inline ll min(ll x,ll y){return x<y?x:y;}
inline ll read()
{
ll x=0,w=1;
char aa=getchar();
while(aa<'0'||aa>'9')
{
if(aa=='-')
{
w=-1;
}
aa=getchar();
}
while(aa>='0'&&aa<='9')
{
x=(x<<3)+(x<<1)+aa-'0';
aa=getchar();
}
return x*w;
}
const int N=100010;
const int M=20*N;
struct tty
{
int x,y,t;
}f[N];
vector<int> x[10*N],y[10*N];
map<int ,int > mp[N];
int dx[8]={-1,1,0,0,-1,-1,1,1},dy[8]={0,0,-1,1,-1,1,-1,1};
int n;
int hd[N],nt[M],ver[M],top;
int hd2[N],nt2[M],ver2[M],top2;
int dfn[N],low[N],num[N],tot,e,be[M];
int sum[N],jh[N],in[N];
int dis[N];
bool b[N];
queue<int> q;
void add(int x,int y)
{
top++;
be[top]=x;
ver[top]=y;
nt[top]=hd[x];
hd[x]=top;
}
void add2(int x,int y)
{
top2++;
ver2[top2]=y;
nt2[top2]=hd2[x];
hd2[x]=top2;
}
void tarjan(int x)
{
dfn[x]=low[x]=++tot;
num[++e]=x;
b[x]=1;
for(int i=hd[x];i;i=nt[i])
{
int y=ver[i];
if(!dfn[y])
{
tarjan(y);
low[x]=min(low[x],low[y]);
}
else if(b[y]==1)
{
low[x]=min(low[x],low[y]);
}
}
if(dfn[x]==low[x])
{
int y;
while(y=num[e--])
{
jh[y]=x;
b[y]=0;
if(x==y)
{
break;
}
sum[x]+=sum[y];
}
}
}
void jsans()
{
for(int i=1;i<=n;i++)
{
if(jh[i]==i&&in[i]==0)
{
q.push(i);
dis[i]=sum[i];
}
}
while(!q.empty())
{
int x=q.front();
q.pop();
for(int i=hd2[x];i;i=nt2[i])
{
int y=ver2[i];
dis[y]=max(dis[y],dis[x]+sum[y]);
in[y]--;
if(in[y]==0)
{
q.push(y);
}
}
}
}
int main()
{
n=read();
int r=read(),c=read();
for(int i=1;i<=n;i++)
{
f[i].x=read();
f[i].y=read();
f[i].t=read();
x[f[i].x].push_back(i);
y[f[i].y].push_back(i);
mp[f[i].x][f[i].y]=i;
}
for(int i=1;i<=n;i++)
{
if(f[i].t==1)
{
for(int j=0;j<x[f[i].x].size();j++)
{
if(i==x[f[i].x][j])
{
continue;
}
add(i,x[f[i].x][j]);
}
}
if(f[i].t==2)
{
for(int j=0;j<y[f[i].y].size();j++)
{
if(i==y[f[i].y][j])
{
continue;
}
add(i,y[f[i].y][j]);
}
}
if(f[i].t==3)
{
for(int j=0;j<8;j++)
{
int xx=f[i].x+dx[j],yy=f[i].y+dy[j];
if(xx<1||xx>r||yy<1||yy>c||mp[xx][yy]==0)
{
continue;
}
add(i,mp[xx][yy]);
}
}
}
for(int i=1;i<=n;i++)
{
sum[i]=1;
}
for(int i=1;i<=n;i++)
{
if(!dfn[i])
{
tarjan(i);
}
}
for(int i=1;i<=top;i++)
{
int x=jh[be[i]],y=jh[ver[i]];
if(x!=y)
{
add2(x,y);
in[y]++;
}
}
jsans();
int ans=0;
for(int i=1;i<=n;i++)
{
ans=max(ans,dis[i]);
}
printf("%d\n",ans);
return 0;
}