#define _USE_MATH_DEFINES

#include <iostream>
#include <iomanip>
#include <stdio.h>

#include <sstream>
#include <algorithm>
#include <iterator>
#include <cmath>
#include <complex>

#include <string>
#include <cstring>
#include <vector>
#include <bitset>

#include <queue>
#include <set>
#include <map>
#include <stack>
#include <list>

#include <ctime>
////
//#include <random>//
/////////

typedef long long LL;
typedef long double LD;
typedef unsigned long long ULL;

////定数
const int INF = (int)1e9 + 10;
const LL MOD = (LL)1e9 + 7;
const LL LINF = (LL)4e18 + 20;
const LD PI = acos(-1.0);
const double EPS = 1e-9; 
/////////
using namespace::std;
template<typename T>
void chmax(T& a, T b) {
	a = max(a, b);
}

template<typename T>
void chmin(T& a, T b) {
	a = min(a, b);
}

template<typename T>
void IN(vector<T> &A,int N=-1) {
	if (N == -1) {
		N = A.size();
	}
	for (int i = 0; i < N; ++i) {
		cin >> A[i];
	}
}

template<typename T>
void SO(vector<T> &A,bool F=false) {
	sort(A.begin(), A.end());
	if (F) {
		reverse(A.begin(), A.end());
	}
}
//////////////
int K;

int f(vector<vector<int>> &A, int x1, int y1, int x2, int y2) {
	if (x2 < 0 || y2 < 0) {
		return 0;
	}
	if (x1 >= 2 * K || y1 >= 2 * K) {
		return 0;
	}

	if (x1 < 0)x1 = 0;
	if (y1 < 0) {y1 = 0;}
	if (x2 >= 2 * K)x2 = 2 * K - 1;
	if (y2 >= 2 * K)y2 = 2 * K - 1;

	if (x2 >= 2 * K) {
		x2 = 2 * K - 1;
	}
	if (y2 >= 2 * K) {
		y2 = 2 * K - 1;
	}
	int ans = 0;
	ans = A[x2][y2];
	if (x1) {
		ans -= A[x1 - 1][y2];
	}
	if (y1) {
		ans -= A[x2][y1 - 1];
	}
	if (x1 > 0 && y1 > 0) {
		ans += A[x1 - 1][y1 - 1];
	}
	return ans;
}
void solve() {
	int N;
	cin >> N >> K;
	
	vector<vector<int>> B(2 * K, vector<int>(2 * K, 0));
	vector<vector<int>> W(2 * K, vector<int>(2 * K, 0));

	for (int i = 0; i < N; ++i) {
		int X, Y; char w;
		cin >> X >> Y >> w;
		X %= 2 * K;
		Y %= 2 * K;
		if (w == 'B') {
			B[X][Y] += 1;
		}
		else {
			W[X][Y] += 1;
		}
	}
	//片方
	for (int x = 1; x < 2 * K; ++x) {
		for (int y = 0; y < 2 * K; ++y) {
			B[x][y] += B[x - 1][y];
			W[x][y] += W[x - 1][y];
		}
	}

	for (int y = 1; y < 2 * K; ++y) {
		for (int x = 0; x < 2 * K; ++x) {
			B[x][y] += B[x][y-1];
			W[x][y] += W[x][y-1];
		}
	}

	LL ans = 0;
	for (int x = 0; x > -2*K; --x) {
		for (int y = 0; y > -2*K; --y) {
			LL res = 0;
			res += f(B, x, y, x + K - 1, y + K - 1);
			res += f(B, x, y + 2*K, x + K - 1, y + 3 * K - 1);
			res += f(B, x + K, y + K, x + 2 * K - 1, y + 2 * K - 1);
			res += f(B, x + K, y + 3*K, x + 2 * K - 1, y + 4 * K - 1);

			res += f(B, x+2*K, y, x + 3*K - 1, y + K - 1);
			res += f(B, x+2*K, y + 2 * K, x + 3*K - 1, y + 3 * K - 1);
			res += f(B, x + 3*K, y + K, x + 4 * K - 1, y + 2 * K - 1);
			res += f(B, x + 3*K, y + 3 * K, x + 4 * K - 1, y + 4 * K - 1);

			//Wもやる
			res += f(W, x, y + K, x + K - 1, y + 2*K - 1);
			res += f(W, x, y + 3*K, x + K - 1, y + 3 * K - 1);
			res += f(W, x+K, y +0*K, x + 2*K - 1, y + 1 * K - 1);
			res += f(W, x + K, y + 2 * K, x + 2 * K - 1, y + 3 * K - 1);

			res += f(W, x +2*K, y + 1 * K, x + 3*K - 1, y + 2 * K - 1);
			res += f(W, x +2*K, y + 3 * K, x + 3*K - 1, y + 4 * K - 1);
			res += f(W, x + 3*K, y + 0 * K, x + 4 * K - 1, y + 1 * K - 1);
			res += f(W, x + 3*K, y + 2 * K, x + 4 * K - 1, y + 3 * K - 1);
			
			chmax(ans, res);
		}
	}
	cout << ans << endl;
}

signed main(void) {
	std::cin.tie(0);
	std::ios::sync_with_stdio(false);
	std::cout << std::fixed;//小数を10進数表示
	cout << setprecision(16);//小数点以下の桁数を指定//coutとcerrで別	

	solve();
}


Measured memory_bytes: 31744