using System;
    using System.Linq;
    using System.Collections.Generic;
    using System.Text.RegularExpressions;
    using System.Text;
    using System.Net;

     
    public class Program
    {

        public void Proc() {
            int[] inpt = Reader.ReadLine().Split(' ').Select(a=>int.Parse(a)).ToArray();
            int kibouCount = inpt[0];
            this.CheckSize = inpt[1];
            int[,] mapSource = new int[CheckSize*2, CheckSize*2];
            for(int i=0; i<kibouCount; i++) {
                string[] tmp = Reader.ReadLine().Split(' ');
                long x = long.Parse(tmp[0]);
                long y = long.Parse(tmp[1]);
                if(tmp[2][0]=='W') {
                    x+=CheckSize;
                }
                int xIdx = (int)x%(CheckSize*2);
                int yIdx = (int)y%(CheckSize*2);
                mapSource[xIdx, yIdx]++;
            }
            this.Map = new int[CheckSize*2,CheckSize*2];
            for(int i=0; i<this.Map.GetLength(0); i++) {
                for(int j=0; j<this.Map.GetLength(0); j++) {
                    int cnt = mapSource[i,j];
                    if(i>0) {
                        cnt+=this.Map[i-1, j];
                    }
                    if(j>0) {
                        cnt+=this.Map[i, j-1];
                    }
                    if(i>0&&j>0){
                        cnt-=this.Map[i-1, j-1];
                    }
                    this.Map[i,j]=cnt;
                }
            }
            int ans = 0;
            for(int i=0; i<this.Map.GetLength(0); i++) {
                for(int j=0; j<this.Map.GetLength(0);j++) {
                    ans = Math.Max(ans, GetAns(i,j, true));
                }
            }
            Console.WriteLine(ans);
        }

        private int GetAns(int x, int y, bool flag) {
            int xBottom = Math.Min(x+CheckSize-1, this.Map.GetLength(0)-1);
            int yBottom = Math.Min(y+CheckSize-1, this.Map.GetLength(0)-1);
            int ans = GetCount(x, y, xBottom, yBottom);
            if(x+CheckSize>this.Map.GetLength(0)) {
                ans+=GetCount(0, y, (x+CheckSize-this.Map.GetLength(0)-1), yBottom);
            }
            if(y+CheckSize>this.Map.GetLength(0)) {
                ans+=GetCount(x, 0, xBottom, (y+CheckSize-this.Map.GetLength(0)-1));
            }
            if(x+CheckSize>this.Map.GetLength(0)&&y+CheckSize>this.Map.GetLength(0)) {
                ans+=GetCount(0, 0, (x+CheckSize-this.Map.GetLength(0)-1), (y+CheckSize-this.Map.GetLength(0)-1));
            }
            int x2 = (x+CheckSize)%(CheckSize*2);
            int y2 = (y+CheckSize)%(CheckSize*2);
            if(flag) {
                ans+=GetAns(x2, y2, false);
            }
            return ans;
        }

        private int GetCount(int x1, int y1, int x2, int y2) {
            int ans = this.Map[x2, y2];
            if(x1>0) {
                ans-=this.Map[x1-1, y2];
            }
            if(y1>0) {
                ans-=this.Map[x2, y1-1];
            }
            if(x1>0&&y1>0) {
                ans+=this.Map[x1-1, y1-1];
            }
            return ans;
        }

        private int[,] Map;

        private int CheckSize;




        public class Reader {
            public static bool IsDebug = false;
            private static System.IO.StringReader SReader;
            private static string InitText = @"




6 2
1 2 B
2 1 W
2 2 B
1 0 B
0 6 W
4 5 W






";
            public static string ReadLine() {
                if(IsDebug) {
                    if(SReader == null) {
                        SReader = new System.IO.StringReader(InitText.Trim());
                    }
                    return SReader.ReadLine();
                } else {
                    return Console.ReadLine();
                }
            }
        }
        public static void Main(string[] args)
        {
            #if DEBUG
            Reader.IsDebug = true;
            #endif
            Program prg = new Program();
            prg.Proc();
        }
    }

Measured memory_bytes: 48444