//marico el que lo lea
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <stdlib.h>
#include <assert.h>
using namespace std;

typedef long long ll;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef pair<int, int> ii;

void fastIO() {
	std::ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
}

#define FOR(i,f,t) for(int i=f; i<(int)t; i++)
#define FORR(i,f,t) for(int i=f; i>(int)t; i--)
#define FORE(i,c) for(auto i = (c).begin(); i != (c).end(); i++)
#define pb push_back
#define all(obj) obj.begin(), obj.end()
#define ms(obj, val) memset(obj, val, sizeof(obj))
#define ms2(obj, val, sz) memset(obj, val, sizeof(obj[0])*sz)

#define fst first
#define snd second

template<typename T, typename U> inline void mnze(T &x, U y) { if(y < x) x = y; }
template<typename T, typename U> inline void mxze(T &x, U y) { if(x < y) x = y; }

void _scan( int &x ) { scanf("%d",&x); }
void _scan( long long &x ) { scanf("%lld",&x); }
void _scan( double &x ) { scanf("%lf",&x); }
void _scan( char &x ) { scanf(" %c",&x); }
void _scan( char *x ) { scanf("%s",x); }
void scan() {}
template<typename T, typename... U>
void scan( T& head, U&... tail ) { _scan(head); scan(tail...);}

template<typename T> void _dbg(const char* sdbg, T h) { cerr<<sdbg<<"="<<h<<"\n"; }
template<typename T, typename... U> void _dbg(const char* sdbg, T h, U... t) {
	while(*sdbg != ',')cerr<<*sdbg++; cerr<<"="<<h<<","; _dbg(sdbg+1, t...);
}

#ifdef LOCAL
#define debug(...) _dbg(#__VA_ARGS__, __VA_ARGS__)
#define debugv(x) {{cerr <<#x <<" = "; FORE(_i, (x)) cerr <<*_i <<", "; cerr <<"\n"; }}
#define debuga(x, sz) {{cerr <<#x <<" = "; FOR(_i, 0, sz) cerr << x[_i] <<", "; cerr <<"\n"; }}
#else
#define debug(...) (__VA_ARGS__)
#define debugv(x)
#define debuga(x, sz)
#define cerr if(0)cout
#endif

///////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////

const int MAXK = 2e3+5;

int K, N;
int grid[MAXK][MAXK];

void print(){
    FOR(r,0,2*K+2){
        FOR(c,0,2*K+2){
            printf("%d ",grid[r][c]);
        }
        printf("\n");
    }
    printf("\n");
}

int sum(int r1, int c1, int r2, int c2){
    if(c2<=0) return 0;
    if(r2<=0) return 0;
    if(c1 >= 2*K+1) return 0;
    if(r1 >= 2*K+1) return 0;
    mxze(r1,1);
    mxze(c1,1);
    mnze(r2, 2*K+1);
    mnze(c2, 2*K+1);
    return grid[r2][c2] - grid[r1-1][c2] - grid[r2][c1-1] + grid[r1-1][c1-1];
}

int sum(int r, int c){
    return sum(r-K+1, c-K+1, r, c);
}

int main(){
    scan(N, K);
    FOR(i,0,N){
        int x, y; char cc[2], c;
        scan(x,y,cc); c = cc[0];
        if(c == 'B'){
            if(x>=K) x-=K;
            else x+=K;
            c = 'W';
        }
        x %= 2*K;
        y %= 2*K;
        grid[x+1][y+1]++;
    }
    FOR(r,0,2*K+2){
        FOR(c,1,2*K+2){
            grid[r][c] = grid[r][c] + grid[r][c-1];
        }
    }
    FOR(r,1,2*K+2){
        FOR(c,1,2*K+2){
            grid[r][c] += grid[r-1][c];
        }
    }
    int ans = 0;
    FOR(r,0,2*K+1) FOR(c,0,2*K+1){
        int res = 0;
        FOR(i,-2,3) FOR(j,-2,3) if((i+j)%2 == 0) res += sum(r+i*K, c+j*K);
        mxze(ans, res);
        mxze(ans, N-res);
    }
    printf("%d\n",ans);
}


Measured memory_bytes: 16000