#ifdef LOCAL111
	#define _GLIBCXX_DEBUG
#else
	#define NDEBUG
#endif
#define _USE_MATH_DEFINES
#include <bits/stdc++.h>
const int INF = 1e9;
using namespace std;
template<typename T, typename U> ostream& operator<< (ostream& os, const pair<T,U>& p) { os << '(' << p.first << ' ' << p.second << ')'; return os; }

#define endl '\n'
#define ALL(a)  (a).begin(),(a).end()
#define SZ(a) int((a).size())
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define RFOR(i,a,b) for (int i=(b)-1;i>=(a);i--)
#define REP(i,n)  FOR(i,0,n)
#define RREP(i,n) for (int i=(n)-1;i>=0;i--)
#ifdef LOCAL111
	#define DEBUG(x) cout<<#x<<": "<<(x)<<endl
	template<typename T> void dpite(T a, T b){ for(T ite = a; ite != b; ite++) cout << (ite == a ? "" : " ") << *ite; cout << endl;}
#else
	#define DEBUG(x) true
	template<typename T> void dpite(T a, T b){ return; }
#endif
#define F first
#define S second
#define SNP string::npos
#define WRC(hoge) cout << "Case #" << (hoge)+1 << ": "
template<typename T> void pite(T a, T b){ for(T ite = a; ite != b; ite++) cout << (ite == a ? "" : " ") << *ite; cout << endl;}
template<typename T> bool chmax(T& a, T b){if(a < b){a = b; return true;} return false;}
template<typename T> bool chmin(T& a, T b){if(a > b){a = b; return true;} return false;}

typedef long long int LL;
typedef unsigned long long ULL;
typedef pair<int,int> P;

void ios_init(){
	//cout.setf(ios::fixed);
	//cout.precision(12);
#ifdef LOCAL111
	return;
#endif
	ios::sync_with_stdio(false); cin.tie(0);	
}

template<typename T>
class CumSum2D {
public:
	vector<vector<T>> table;
	CumSum2D(int h, int w) {
		table = vector<vector<T>>(h+1, vector<T>(w+1));
	}

	T get(int i, int j) {
		return table[i+1][j+1];
	}

	void update(int i, int j, T val) {
		table[i+1][j+1] = val;
	}

	void add(int i, int j, T val) {
		table[i+1][j+1] += val;
	}

	void init() {
		for(int i = 0; i < (int)table.size()-1; ++i) {
			for(int j = 0; j < (int)table[i].size()-1; ++j) {
				table[i+1][j+1] += table[i+1][j]+table[i][j+1]-table[i][j];
			}
		}
	}

	T query(int si, int sj, int ti, int tj) {
		return table[ti][tj] - table[si][tj] -table[ti][sj] + table[si][sj]; 
	}
};

int main()
{
	ios_init();
	int n, k;
	while(cin >> n >> k) {
		using vi = vector<int>;
		CumSum2D<int> wc(2*k, 2*k);
		CumSum2D<int> bc(2*k, 2*k);
		REP(i, n){
			int x, y;
			char c;
			cin >> x >> y >> c;
			x %= 2*k;
			y %= 2*k;
			if(c == 'W') {
				wc.add(x, y, 1);
			} else {
				bc.add(x, y, 1);
			}
		}
		wc.init();
		bc.init();
		int ans = 0;
		REP(i, k) REP(j, k) {
			DEBUG(i); DEBUG(j);
			// int sum = sumb(i+k, j+k, i, j) + sumb(i, j, 0, 0) + sumb(2*k, 2*k, i+k, j+k)
			// 			 + sumb(2*k, j ,i+k, 0) + sumb(i, 2*k, 0,j+k)
			// 			+ sumw(i+k, j, i, 0) + sumw(i, j+k, 0, j) + sumw(2*k,j+k ,i+k, j) + sumw(i+k, 2*k,i ,j+k);
			int sum = bc.query(i, j, i+k, j+k) + bc.query(0, 0, i, j) + bc.query(i+k, j+k, 2*k, 2*k)
						+ bc.query(i+k, 0, 2*k, j) + bc.query(0, j+k, i, 2*k)
						+ wc.query(i, 0, i+k, j) + wc.query(0, j, i, j+k) + wc.query(i+k, j, 2*k, j+k) + wc.query(i, j+k, i+k,2*k);
			chmax(ans, sum);
		}
		swap(wc,bc);
		REP(i, k) REP(j, k) {
			DEBUG(i); DEBUG(j);
			// int sum = sumb(i+k, j+k, i, j) + sumb(i, j, 0, 0) + sumb(2*k, 2*k, i+k, j+k)
			// 			 + sumb(2*k, j ,i+k, 0) + sumb(i, 2*k, 0,j+k)
			// 			+ sumw(i+k, j, i, 0) + sumw(i, j+k, 0, j) + sumw(2*k,j+k ,i+k, j) + sumw(i+k, 2*k,i ,j+k);
			int sum = bc.query(i, j, i+k, j+k) + bc.query(0, 0, i, j) + bc.query(i+k, j+k, 2*k, 2*k)
						+ bc.query(i+k, 0, 2*k, j) + bc.query(0, j+k, i, 2*k)
						+ wc.query(i, 0, i+k, j) + wc.query(0, j, i, j+k) + wc.query(i+k, j, 2*k, j+k) + wc.query(i, j+k, i+k,2*k);
			chmax(ans, sum);
		}
		cout << ans << endl;
	}
	return 0;
}


Measured memory_bytes: 31744