#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <cfloat>
#include <stack>
#include <queue>
#include <vector>
#include <string>
#include <iostream>
#include <set>
#include <map>
#include <time.h>
typedef long long int ll;
typedef unsigned long long int ull;
#define BIG_NUM 2000000000
#define MOD 1000000007
#define EPS 0.000000001
using namespace std;


struct Info{
	Info(){
		x = y = id = 0;
		dir = '@';
	}
	Info(int arg_x,int arg_y,int arg_id,char arg_dir){
		x = arg_x;
		y = arg_y;
		id = arg_id;
		dir = arg_dir;
	}
	bool operator<(const struct Info &arg) const{ //x座標の昇順
		return x < arg.x;
	}
	int x,y,id;
	char dir;
};

struct Data{
	Data(int arg_time,int arg_id){
		time = arg_time;
		id = arg_id;
	}
	bool operator<(const struct Data &arg) const{
		if(time != arg.time){ //落下時刻が異なれば、昇順(PQ)
			return time > arg.time;
		}else{ //落下時刻が同じなら、idの昇順(PQ)
			return id > arg.id;
		}
	}
	int time,id;
};

int W,H,N;
Info info[200000];
map<int,bool> MAP;
map<int,int> SUM_MAP;
vector<Info> GROUP[200000];
vector<int> V;
priority_queue<Data> ANS_Q;


void calc_group(int id){
	int sum = V[id];
	int ant_id,most_left_ant,time;
	queue<int> ID,REST_TIME;

	if(sum%2 == 0){ //全員が白いマス:x座標の偶奇が同じ者同士が白いマスで出会う

		for(int i = 0; i <= 1; i++){ //x座標の偶奇のループ

			for(int k = 0; k < GROUP[id].size(); k++){
				if(GROUP[id][k].x%2 != i)continue; //x座標の偶奇がiと一致しないならSKIP

				ant_id = GROUP[id][k].id;

				if(info[ant_id].dir == 'S'){ //南向きの蟻
					ID.push(ant_id); //idをpush
					most_left_ant = ID.front(); //最も左にいる(最後にすれ違う)蟻のIDを取り出し
					ID.pop();

					//★most_left_antは、南向きの蟻(ant_id)が落ちるはずだった時刻に落ちる★
					time = H-info[ant_id].y;

					ANS_Q.push(Data(time,most_left_ant));

				}else{ //東向きの蟻
					ID.push(ant_id); //idをpush
					REST_TIME.push(W-info[ant_id].x); //落ちるまでの時間をpush
				}
			}
			//右向きの蟻
			while(!ID.empty()){
				most_left_ant = ID.front(); //最も左にいる蟻のIDを取り出し
				ID.pop();

				//落下する時刻を求める:元々右向きの蟻が落ちるはずだった時刻に落ちる
				time = REST_TIME.front();
				REST_TIME.pop();

				ANS_Q.push(Data(time,most_left_ant));
			}
		}

	}else{ //全員が黒いマス:x座標の偶奇が異なる者同士が白いマスで出会う

		for(int i = 0; i <= 1; i++){ //x座標の偶奇のループ

			for(int k = 0; k < GROUP[id].size(); k++){
				//x座標の偶奇がiと一致する東向きの蟻と、x座標の偶奇がiと異なる南向きの蟻を処理する
				if(GROUP[id][k].x%2 != i && info[GROUP[id][k].id].dir == 'E')continue;
				if(GROUP[id][k].x%2 == i && info[GROUP[id][k].id].dir == 'S')continue;

				ant_id = GROUP[id][k].id;

				if(info[ant_id].dir == 'S'){ //南向きの蟻
					ID.push(ant_id); //idをpush
					most_left_ant = ID.front(); //最も左にいる(最後にすれ違う)蟻のIDを取り出し
					ID.pop();

					//★most_left_antは、南向きの蟻(ant_id)が落ちるはずだった時刻に落ちる★
					time = H-info[ant_id].y;

					ANS_Q.push(Data(time,most_left_ant));

				}else{ //東向きの蟻
					ID.push(ant_id); //idをpush
					REST_TIME.push(W-info[ant_id].x); //落ちるまでの時間をpush
				}
			}
			//右向きの蟻
			while(!ID.empty()){
				most_left_ant = ID.front(); //最も左にいる蟻のIDを取り出し
				ID.pop();

				//落下する時刻を求める:元々右向きの蟻が落ちるはずだった時刻に落ちる
				time = REST_TIME.front();
				REST_TIME.pop();

				ANS_Q.push(Data(time,most_left_ant));
			}
		}
	}
}

int main(){

	int tmp;
	scanf("%d %d %d",&W,&H,&N);

	char buf[2];

	for(int i = 0; i < N; i++){
		scanf("%d %d %s",&info[i].x,&info[i].y,buf);
		info[i].id = i;
		info[i].dir = buf[0];

		tmp = info[i].x+info[i].y;

		auto at = MAP.find(tmp);

		if(at != MAP.end())continue;
		MAP[tmp] = true;
		V.push_back(tmp);
	}

	sort(V.begin(),V.end());

	for(int i = 0; i < V.size(); i++){
		SUM_MAP[V[i]] = i;
	}

	//x+yの値ごとに、蟻をグループ分けする
	for(int i = 0; i < N; i++){
		GROUP[SUM_MAP[info[i].x+info[i].y]].push_back(info[i]);
	}

	for(int i = 0; i < V.size(); i++){
		sort(GROUP[i].begin(),GROUP[i].end());
		calc_group(i);
	}

	while(!ANS_Q.empty()){
		printf("%d\n",ANS_Q.top().id+1);
		ANS_Q.pop();
	}

	return 0;
}



Measured memory_bytes: 38500