#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int dp[N],low[N],dfn[N],s[N],col[N],sum[N];
int ans,n,R,C,cnt1=0,sc=0,len;bool in_s[N];
vector<int> a[N],e[N];map<pair<int,int>,int>mp;
void tarjan(int x){
dfn[x]=low[x]=++cnt1,in_s[x]=true,s[++len]=x;
for(int i=0;i<a[x].size();i++){
int y=a[x][i];if(dfn[y]==0)tarjan(y),low[x]=min(low[x],low[y]);
else if(in_s[y]==true)low[x]=min(low[x],dfn[y]);
}
if(dfn[x]==low[x]){
sc++;while(s[len]!=x)in_s[s[len]]=false,col[s[len]]=sc,sum[sc]+=s[len]<=n?1:0,len--;
in_s[s[len]]=false,col[s[len]]=sc,sum[sc]+=s[len]<=n?1:0,len--;
}
}
void dfs(int x,int fa){
if(dp[x]>sum[x])return ;dp[x]=sum[x];
for(int i=0;i<e[x].size();i++){
int y=e[x][i];if(y==fa)continue;
dfs(y,x),dp[x]=max(dp[x],dp[y]+sum[x]);
}
}
struct tip{int x,y,id;}u[5][N];int cnt[5];bool cmp1(tip a,tip b){return a.x<b.x;}bool cmp2(tip a,tip b){return a.y<b.y;}
int main(){
cin>>n>>R>>C;for(int i=1;i<=n;i++){int x,y,t;scanf("%d%d%d",&x,&y,&t),u[t][++cnt[t]].x=x,u[t][cnt[t]].y=y,mp[make_pair(x,y)]=i,u[t][cnt[t]].id=i;}
sort(u[1]+1,u[1]+1+cnt[1],cmp1),sort(u[2]+1,u[2]+1+cnt[2],cmp2);
for(int i=1;i<=cnt[1];i++)if(u[1][i-1].x==u[1][i].x)a[u[1][i].id].push_back(u[1][i-1].id),a[u[1][i-1].id].push_back(u[1][i].id);
for(int i=1;i<=cnt[2];i++)if(u[2][i-1].y==u[2][i].y)a[u[2][i].id].push_back(u[2][i-1].id),a[u[2][i-1].id].push_back(u[2][i].id);
for(int i=1;i<=cnt[3];i++){
if(mp.find(make_pair(u[3][i].x-1,u[3][i].y))!=mp.end()) a[u[3][i].id].push_back(mp[make_pair(u[3][i].x-1,u[3][i].y)]);
if(mp.find(make_pair(u[3][i].x-1,u[3][i].y-1))!=mp.end()) a[u[3][i].id].push_back(mp[make_pair(u[3][i].x-1,u[3][i].y-1)]);
if(mp.find(make_pair(u[3][i].x-1,u[3][i].y+1))!=mp.end()) a[u[3][i].id].push_back(mp[make_pair(u[3][i].x-1,u[3][i].y+1)]);
if(mp.find(make_pair(u[3][i].x+1,u[3][i].y))!=mp.end()) a[u[3][i].id].push_back(mp[make_pair(u[3][i].x+1,u[3][i].y)]);
if(mp.find(make_pair(u[3][i].x+1,u[3][i].y-1))!=mp.end()) a[u[3][i].id].push_back(mp[make_pair(u[3][i].x+1,u[3][i].y-1)]);
if(mp.find(make_pair(u[3][i].x+1,u[3][i].y+1))!=mp.end()) a[u[3][i].id].push_back(mp[make_pair(u[3][i].x+1,u[3][i].y+1)]);
if(mp.find(make_pair(u[3][i].x,u[3][i].y+1))!=mp.end()) a[u[3][i].id].push_back(mp[make_pair(u[3][i].x,u[3][i].y+1)]);
if(mp.find(make_pair(u[3][i].x,u[3][i].y-1))!=mp.end()) a[u[3][i].id].push_back(mp[make_pair(u[3][i].x,u[3][i].y-1)]);
}
sort(u[1]+1,u[1]+1+cnt[1],cmp2),sort(u[2]+1,u[2]+1+cnt[2],cmp2),sort(u[3]+1,u[3]+1+cnt[3],cmp2);
for(int l=1,r=1;l<=cnt[1];l++){
if(u[2][r].y==u[1][l].y)a[u[2][r].id].push_back(u[1][l].id);
else if(u[2][r].y>u[1][l].y)continue;
else {
while(r<=cnt[2]&&u[2][r].y<u[1][l].y)r++;
if(u[2][r].y==u[1][l].y)a[u[2][r].id].push_back(u[1][l].id);
else if(u[2][r].y>u[1][l].y)continue;
}
}
for(int l=1,r=1;l<=cnt[3];l++){
if(u[2][r].y==u[3][l].y)a[u[2][r].id].push_back(u[3][l].id);
else if(u[2][r].y>u[3][l].y)continue;
else {
while(r<=cnt[2]&&u[2][r].y<u[3][l].y)r++;
if(u[2][r].y==u[3][l].y)a[u[2][r].id].push_back(u[3][l].id);
else if(u[2][r].y>u[3][l].y)continue;
}
}
sort(u[2]+1,u[2]+1+cnt[2],cmp1),sort(u[1]+1,u[1]+1+cnt[1],cmp1),sort(u[3]+1,u[3]+1+cnt[3],cmp1);
for(int l=1,r=1;l<=cnt[2];l++){
if(u[1][r].x==u[2][l].x)a[u[1][r].id].push_back(u[2][l].id);
else if(u[1][r].x>u[2][l].x)continue;
else {
while(r<=cnt[1]&&u[1][r].x<u[2][l].x)r++;
if(u[1][r].x==u[2][l].x)a[u[1][r].id].push_back(u[2][l].id);
else if(u[1][r].x>u[2][l].x)continue;
}
}
for(int l=1,r=1;l<=cnt[3];l++){
if(u[1][r].x==u[3][l].x)a[u[1][r].id].push_back(u[3][l].id);
else if(u[1][r].x>u[2][l].x)continue;
else {
while(r<=cnt[1]&&u[1][r].x<u[3][l].x)r++;
if(u[1][r].x==u[3][l].x)a[u[1][r].id].push_back(u[3][l].id);
else if(u[1][r].x>u[3][l].x)continue;
}
}
// for(int i=1;i<=n;i++)printf("[%d=%d]",i,a[i].size());
// for(int i=1;i<=3;i++){for(int j=1;j<=cnt[i];j++)printf("[%d %d %d] ",u[i][j].x,u[i][j].y,u[i][j].id);printf("\n");}
// for(int i=1;i<=n;i++){printf("%d:",i);for(int j=0;j<a[i].size();j++)printf("%d ",a[i][j]);printf("\n");}
for(int i=1;i<=n;i++)if(dfn[i]==0)tarjan(i);
// for(int i=1;i<=n;i++)printf("%d ",col[i]);
// printf("\n\n\n");
for(int i=1;i<=sc;i++)s[i]=0;
for(int i=1;i<=n;i++)for(int j=0;j<a[i].size();j++)if(col[i]!=col[a[i][j]])e[col[i]].push_back(col[a[i][j]]),s[col[i]]++;
// for(int i=1;i<=sc;i++){printf("%d:",i);for(int j=0;j<e[i].size();j++)printf("%d ",e[i][j]);printf("\n");}
for(int i=1;i<=sc;i++)dfs(i,0),ans=max(ans,dp[i]);
printf("%d",ans);return 0;
}
RT