#include <bits/stdc++.h>
using namespace std;

typedef int64_t Int;
#define all(x) (x).begin(), (x).end()
 
const double EPS = 1e-10;
const Int INF = 1e18;
const int inf = 1e9;
const Int mod = 1e9+7;

bool print_space_enable = false;
void print() { 
    cout << endl; 
    print_space_enable = false;
}

template <class Head, class... Tail>
void print(Head&& head, Tail&&... tail) {
    if (print_space_enable) cout << " ";
    cout << fixed << setprecision(15) << head;
    print_space_enable = true;
    print(std::forward<Tail>(tail)...);
}

template<typename T>
void print(vector<T> v) {
    for (size_t i = 0; i < v.size(); i++) {
        if (i > 0) std::cout << " ";
        std::cout << v[i];
    }
    std::cout << std::endl;
}

int main() {
    Int n, k;
    cin >> n >> k;
    vector<Int> x(n), y(n);
    vector<bool> c(n);
    for (Int i = 0; i < (Int)n; i++) {
        cin >> x[i] >> y[i];
        char a;
        cin >> a;
        c[i] = (a == 'B');
    }
    for (Int i = 0; i < (Int)n; i++) {
        if (x[i] / k % 2 == 1) {
            c[i] = not c[i];
        }
        if (y[i] / k % 2 == 1) {
            c[i] = not c[i];
        }
    }
    vector<vector<Int>> a(k, vector<Int>(k, 0));
    for (Int i = 0; i < (Int)n; i++) {
        if (c[i]) {
            a[y[i] % k][x[i] % k]++;
        }
    }
    for (Int i = 0; i < k; i++) {
        for (Int j = 0; j < k - 1; j++) {
            a[i][j + 1] += a[i][j];
        }
    }
    for (Int j = 0; j < k; j++) {
        for (Int i = 0; i < k - 1; i++) {
            a[i + 1][j] += a[i][j];
        }
    }
    vector<vector<Int>> b(k, vector<Int>(k, 0));
    for (Int i = 0; i < (Int)n; i++) {
        if (not c[i]) {
            b[y[i] % k][x[i] % k]++;
        }
    }
    for (Int i = 0; i < k; i++) {
        for (Int j = 0; j < k - 1; j++) {
            b[i][j + 1] += b[i][j];
        }
    }
    for (Int j = 0; j < k; j++) {
        for (Int i = 0; i < k - 1; i++) {
            b[i + 1][j] += b[i][j];
        }
    }
    Int res1 = 0;
    for (Int i = 0; i < (Int)n; i++) {
        if (c[i]) res1++;
    }
    for (Int i = 0; i < (Int)k - 1; i++) {
        for (Int j = 0; j < (Int)k - 1; j++) {
            Int add1 = a[i][j] + (a[k - 1][k - 1] - a[i][k - 1] - a[k - 1][j] + a[i][j]);
            Int add2 = b[i][k - 1] - b[i][j] + b[k - 1][j] - b[i][j];
            res1 = max(res1, add1 + add2);
        }
    }
    for (Int i = 0; i < k - 1; i++) {
        Int add1 = a[k - 1][i];
        Int add2 = b[k - 1][k - 1] - b[k - 1][i];
        res1 = max(res1, add1 + add2);
        add1 = a[i][k - 1];
        add2 = b[k - 1][k - 1] - b[i][k - 1];
        res1 = max(res1, add1 + add2);
    }
    Int res2 = 0;
    for (Int i = 0; i < (Int)n; i++) {
        if (not c[i]) res2++;
    }
    for (Int i = 0; i < (Int)k - 1; i++) {
        for (Int j = 0; j < (Int)k - 1; j++) {
            Int add1 = b[i][j] + (b[k - 1][k - 1] - b[i][k - 1] - b[k - 1][j] + b[i][j]);
            Int add2 = a[i][k - 1] - a[i][j] + a[k - 1][j] - a[i][j];
            res2 = max(res2, add1 + add2);
        }
    }
    for (Int i = 0; i < k - 1; i++) {
        Int add1 = b[k - 1][i];
        Int add2 = a[k - 1][k - 1] - a[k - 1][i];
        res2 = max(res2, add1 + add2);
        add1 = b[i][k - 1];
        add2 = a[k - 1][k - 1] - a[i][k - 1];
        res2 = max(res2, add1 + add2);
    }
    print(max(res1, res2));
    return 0;
}

Measured memory_bytes: 20664