#include <bits/stdc++.h>
#ifdef __DEBUG__
    #define DBG(X) cout << #X << " = " << (X) << endl;
    #define SAY(X) cout << (X) << endl;
#else
    #define DBG(X)
    #define SAY(X)
#endif

using namespace std;

using ll = long long int;
using ull = unsigned long long int;
using ld = long double;
using pii = pair<int, int>;
using pll = pair<ll, ll>;

int dx[]={1, 0, -1, 0, 1,-1, 1,-1};
int dy[]={0, 1, 0, -1, 1, 1,-1,-1};
const int INT_INF = (int)(2e9);
const ll  LL_INF = (ll)(2e18);

inline void fast_io() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); };
template<typename T, typename S> inline ostream& operator<<(ostream& os, const pair<T, S> p) { cout << "[" << p.first << ";" << p.second << "]"; return os; }
template<typename T, typename S> inline ostream& operator<<(ostream& os, const map<T, S> p) { for (auto el : p) cout << "[" << el.first << ";" << el.second << "]"; return os; }
template<typename T> inline ostream& operator<<(ostream& os, const vector<T>& v) { for (auto el : v) cout << el << " "; return os; }
template<typename T> inline ostream& operator<<(ostream& os, const deque<T>& v) { for (auto el : v) cout << el << " "; return os; }
template<typename T> inline ostream& operator<<(ostream& os, const set<T>& v) { for (auto el : v) cout << el << " "; return os; }
template<typename T> inline vector<T> fetch_vec(int sz) { vector<T> ret(sz); for (auto& elem : ret) cin >> elem; return ret; }

int N,K;
struct checker
{
    ll x,y;
    int f,s;
    checker(ll x, ll y, int f,int s):x(x),y(y),f(f),s(s){}
};
vector<checker> Cs;
vector<vector<pii> > KK;
vector<vector<int> > Black,White;

void input(){
    fast_io();
    cin >> N >> K;
    Black.assign(K+1,vector<int>(K+1,0));
    White.assign(K+1,vector<int>(K+1,0));

    for (int i = 0; i < N; i++)
    {
        ll x,y;
        char c;
        cin >> x >> y >> c;
        x %= (2*K);
        y %= (2*K);
        if(c=='B') {
            if(x<K && y<K) Black[x][y]++;
            else if(x>=K && y<K) White[x-K][y]++;
            else if(x<K && y>=K) White[x][y-K]++; 
            else if(x>=K && y>=K) Black[x-K][y-K]++;
            }
        else {
            if(x<K && y<K) White[x][y]++;
            else if(x>=K && y<K) Black[x-K][y]++;
            else if(x<K && y>=K) Black[x][y-K]++; 
            else if(x>=K && y>=K) White[x-K][y-K]++;
        }
    }
}

int solve(){
    int ans = 0;
    vector<vector<int> > BS(K+1,vector<int>(K+1,0));
    vector<vector<int> > WS(K+1,vector<int>(K+1,0));

    for (int i = 0; i < K; i++)
    {
        for (int j = 0; j < K; j++)
        {
            BS[i+1][j+1] = BS[i][j+1] + BS[i+1][j] - BS[i][j] + Black[i][j];
            WS[i+1][j+1] = WS[i][j+1] + WS[i+1][j] - WS[i][j] + White[i][j];
        }        
    }


    for (int x = 0; x < K; x++)
    {
        for (int y = 0; y < K; y++)
        {
            int tmp = 0;
            tmp += BS[K][K]-BS[x][K]-BS[K][y]+BS[x][y];
            tmp += BS[x][y]-BS[x][0]-BS[0][y]+BS[0][0];

            tmp += WS[K][y]-WS[K][0]-WS[x][y]+WS[x][0];
            tmp += WS[x][K]-WS[x][y]-WS[0][K]+WS[0][y];

            ans = max(ans,tmp);
            ans = max(ans,N-tmp);
        }
    }
    DBG(BS)
    DBG(WS)

    cout << ans << endl;    
    return 0;
}   

int main()
{
    input();
    solve();
    return 0;
}

Measured memory_bytes: 19016