#include<iostream>
#include<string>
#include<cstdio>
#include<vector>
#include<cmath>
#include<algorithm>
#include<functional>
#include<iomanip>
#include<queue>
#include<ciso646>
#include<random>
#include<map>
#include<set>
#include<complex>
#include<bitset>
using namespace std;
typedef long long ll;
typedef unsigned int ui;
const ll MOD = (1e+9)+7;
const ll INF = (ll)1000000007 * 1000000007;
typedef pair<int, int> P;
#define stop char nyaa;cin>>nyaa;
#define rep(i,n) for(int i=0;i<n;i++)
#define per(i,n) for(int i=n-1;i>=0;i--)
#define Rep(i,sta,n) for(int i=sta;i<n;i++)
#define rep1(i,n) for(int i=1;i<=n;i++)
#define per1(i,n) for(int i=n;i>=1;i--)
#define Rep1(i,sta,n) for(int i=sta;i<=n;i++)
typedef long double ld;
typedef complex<ld> Point;
const ld eps = 1e-11;
const ld pi = acos(-1.0);
typedef pair<ll, ll> LP;
typedef pair<ld, ld> LDP;
int cntw[2000][2000] = {}; int cntb[2000][2000] = {};
int main() {
	int n, k; cin >> n >> k;
	int w = 0; int b = 0;
	rep(i, n) {
		int x, y; cin >> x >> y;
		char c; cin >> c;
		if (c == 'B') {
			b++;
			cntb[x % (2 * k)][y % (2 * k)]++;
		}
		else {
			w++;
			cntw[x % (2 * k)][y % (2 * k)]++;
		}
	}
	rep(i, 2 * k) {
		rep(j, 2 * k) {
			if (i > 0) {
				cntb[i][j] += cntb[i - 1][j];
				cntw[i][j] += cntw[i - 1][j];
			}
			if (j > 0) {
				cntb[i][j] += cntb[i][j - 1];
				cntw[i][j] += cntw[i][j - 1];
			}
			if (i > 0 && j > 0) {
				cntb[i][j] -= cntb[i - 1][j - 1];
				cntw[i][j] -= cntw[i - 1][j - 1];
			}
		}
	}
	int out = 0;
	rep(i, k) {
		rep(j, k) {
			int sum = cntb[i + k - 1][j + k - 1];
			sum += cntb[2 * k - 1][2 * k - 1];
			sum -= cntb[i + k - 1][2 * k - 1];
			sum -= cntb[2 * k - 1][j + k - 1];
			sum += cntb[i + k - 1][j + k - 1];
			if (i > 0) {
				sum -= cntb[i - 1][j + k - 1];
				sum += cntb[i - 1][2 * k - 1];
				sum -= cntb[i - 1][j + k - 1];
			}
			if (j > 0) {
				sum -= cntb[i + k - 1][j - 1];
				sum += cntb[2 * k - 1][j - 1];
				sum -= cntb[i + k - 1][j - 1];
			}
			if (i > 0 && j > 0) {
				sum += cntb[i - 1][j - 1];
				sum += cntb[i - 1][j - 1];
			}
			int csum = cntw[i + k - 1][j + k - 1];
			csum += cntw[2 * k - 1][2 * k - 1];
			csum -= cntw[i + k - 1][2 * k - 1];
			csum -= cntw[2 * k - 1][j + k - 1];
			csum += cntw[i + k - 1][j + k - 1];
			if (i > 0) {
				csum -= cntw[i - 1][j + k - 1];
				csum += cntw[i - 1][2 * k - 1];
				csum -= cntw[i - 1][j + k - 1];
			}
			if (j > 0) {
				csum -= cntw[i + k - 1][j - 1];
				csum += cntw[2 * k - 1][j - 1];
				csum -= cntw[i + k - 1][j - 1];
			}
			if (i > 0 && j > 0) {
				csum += cntw[i - 1][j - 1];
				csum += cntw[i - 1][j - 1];
			}
			out = max(out, sum + w - csum);
		}
	}
	rep(i, k) {
		rep(j, k) {
			int sum = cntw[i + k - 1][j + k - 1];
			sum += cntw[2 * k - 1][2 * k - 1];
			sum -= cntw[i + k - 1][2 * k - 1];
			sum -= cntw[2 * k - 1][j + k - 1];
			sum += cntw[i + k - 1][j + k - 1];
			if (i > 0) {
				sum -= cntw[i - 1][j + k - 1];
				sum += cntw[i - 1][2 * k - 1];
				sum -= cntw[i - 1][j + k - 1];
			}
			if (j > 0) {
				sum -= cntw[i + k - 1][j - 1];
				sum += cntw[2 * k - 1][j - 1];
				sum -= cntw[i + k - 1][j - 1];
			}
			if (i > 0 && j > 0) {
				sum += cntw[i - 1][j - 1];
				sum += cntw[i - 1][j - 1];
			}
			int csum = cntb[i + k - 1][j + k - 1];
			csum += cntb[2 * k - 1][2 * k - 1];
			csum -= cntb[i + k - 1][2 * k - 1];
			csum -= cntb[2 * k - 1][j + k - 1];
			csum += cntb[i + k - 1][j + k - 1];
			if (i > 0) {
				csum -= cntb[i - 1][j + k - 1];
				csum += cntb[i - 1][2 * k - 1];
				csum -= cntb[i - 1][j + k - 1];
			}
			if (j > 0) {
				csum -= cntb[i + k - 1][j - 1];
				csum += cntb[2 * k - 1][j - 1];
				csum -= cntb[i + k - 1][j - 1];
			}
			if (i > 0 && j > 0) {
				csum += cntb[i - 1][j - 1];
				csum += cntb[i - 1][j - 1];
			}
			out = max(out, sum + b - csum);
		}
	}
	cout << out << endl;
	return 0;
}

Measured memory_bytes: 31488