/*
ЗАПУСКАЕМ ВЫСОКОГО
░ГУСЯ░▄▀▀▀▄░РАБОТЯГИ░░
▄███▀░◐░░░▌░░░░░░░
░░░░▌░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▌░░░░░▐▄▄░░░░░
░░░░▌░░░░░▐▄▄░░░░░
░░░░▌░░░░░▐▄▄░░░░░
░░░░▌░░░░░▐▄▄░░░░░
░░░░▌░░░░░▐▄▄░░░░░
░░░░▌░░░░░▐▄▄░░░░░
░░░░▌░░░░░▐▄▄░░░░░
░░░░▌░░░░░▐▄▄░░░░░
░░░░▌░░░░░▐▄▄░░░░░
░░░░▌░░░░░▐▄▄░░░░░
░░░░▌░░░░░▐▄▄░░░░░
░░░░▌░░░░░▐▄▄░░░░░
░░░░▌░░░░░▐▄▄░░░░░
░░░░▌░░░░░▐▄▄░░░░░
░░░░▌░░░░░▐▄▄░░░░░
░░░░▌░░░░░▐▄▄░░░░░
░░░░▌░░░░░▐▄▄░░░░░
░░░░▌░░░░░▐▄▄░░░░░
░░░░▌░░░░░▐▄▄░░░░░
░░░░▌░░░░░▐▄▄░░░░░
░░░░▌░░░░░▐▄▄░░░░░
░░░░▌░░░░░▐▄▄░░░░░
░░░░▌░░░░░▐▄▄░░░░░
░░░░▌░░░░░▐▄▄░░░░░
░░░░▌░░░░░▐▄▄░░░░░
░░░░▌░░░░░▐▄▄░░░░░
░░░░▌░░░░░▐▄▄░░░░░
░░░░▌░░░░▄▀▒▒▀▀▀▀▄
░░░▐░░░░▐▒▒▒▒▒▒▒▒▀▀▄
░░░▐░░░░▐▄▒▒▒▒▒▒▒▒▒▒▀▄
░░░░▀▄░░░░▀▄▒▒▒▒▒▒▒▒▒▒▀▄
░░░░░░▀▄▄▄▄▄█▄▄▄▄▄▄▄▄▄▄▄▀▄
░░░░░░░░░░░▌▌░▌▌░░░░░
░░░░░░░░░░░▌▌░▌▌░░░░░
░░░░░░░░░▄▄▌▌▄▌▌░░░░░ 
 */
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx")
#include <bits/stdc++.h>

using std::cerr;
using std::cin;
using std::cout;

using std::abs;
using std::min;
using std::max;
using std::swap;

using std::map;
using std::pair;
using std::set;
using std::string;
using std::vector;

using ll = long long;
using uint = unsigned int;
using pii = pair<int, int>;
using pll = pair<ll, ll>;

#define ff first
#define ss second
#define pb emplace_back
template<typename T> 
void _dbg(const char* _s, T _h) {
    cerr << _s << " = " << _h <<"\n"; 
}
template<typename T, typename... Ts>
void _dbg(const char* _s, T _h, Ts... _t) {
    int _b = 0;
    while (((_b += *_s == '(') -= *_s == ')') != 0 || *_s != ',')
        cerr << *_s++; 
    cerr << " = " << _h << ","; 
    _dbg(_s+1, _t...);
}
#ifdef LOCAL
#define dbg(...) _dbg(#__VA_ARGS__, __VA_ARGS__)
#else
#define dbg(...) 
#endif

struct init {
    init() {
        cin.tie(0);
        std::iostream::sync_with_stdio(0);
        cout << std::fixed << std::setprecision(10);
        cerr << std::fixed << std::setprecision(5);
        #ifdef LOCAL
        srand(300); 
        #else
        using namespace std::chrono;
        srand(duration_cast<nanoseconds>(high_resolution_clock::now().time_since_epoch()).count()); 
        #endif
    }
    ~init() {
        #ifdef LOCAL
        cerr << "Time elapsed: " << (double)clock() / CLOCKS_PER_SEC << "s.\n";
        #endif
    }
} init;

const int MAXN = 2018/2;
int w[MAXN][MAXN], pw[MAXN][MAXN];
int b[MAXN][MAXN], pb[MAXN][MAXN];

int getw(int x1, int y1, int x2, int y2) {
    if (x2 < x1 || y2 < y1) return 0;
    return pw[x2][y2] - pw[x1 - 1][y2] - pw[x2][y1 - 1] + pw[x1 - 1][y1 - 1];
}
int getb(int x1, int y1, int x2, int y2) {
    if (x2 < x1 || y2 < y1) return 0;
    return pb[x2][y2] - pb[x1 - 1][y2] - pb[x2][y1 - 1] + pb[x1 - 1][y1 - 1];
}

int main() {
    
    int n, k;
    cin >> n >> k;
    for (int i = 0; i < n; ++i) {
        int x, y;
        char cc;
        cin >> x >> y >> cc;
        bool c = cc == 'W';
        int dx = x/k, dy = y/k;
        if ((dx + dy) & 1) c^=1;
        x%=k, y%=k;
        if (c) {
            ++w[x+1][y+1];
        } else {
            ++b[x+1][y+1];
        }
    }

    for (int i = 1; i <= k; ++i)
        for (int j = 1; j <= k; ++j) {
            pw[i][j] = pw[i - 1][j] + pw[i][j - 1] - pw[i - 1][j - 1] + w[i][j];
            pb[i][j] = pb[i - 1][j] + pb[i][j - 1] - pb[i - 1][j - 1] + b[i][j];
        }

    int ans = 0;
    for (int i = 0; i <= k; ++i) {
        for (int j = 0; j <= k; ++j) {
            int pot = getw(1, 1, i, j) + 
                      getw(i + 1, j + 1, k, k) + 
                      getb(1, j + 1, i, k) + 
                      getb(i + 1, 1, k, j);
            if (ans < pot)
                ans = pot;
        }
    }
    for (int i = 0; i <= k; ++i) {
        for (int j = 0; j <= k; ++j) {
            int pot = getb(1, 1, i, j) + 
                      getb(i + 1, j + 1, k, k) + 
                      getw(1, j + 1, i, k) + 
                      getw(i + 1, 1, k, j);
            if (ans < pot)
                ans = pot;
        }
    }

    cout << ans << '\n';
    
    return 0;
}


Measured memory_bytes: 16128