#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
#define endl '\n'
using namespace std;
const int MAXN = 2e5 + 10;
struct Ship
{
int x, y, dir, idx;
Ship(){};
Ship(int x, int y, int dir, int idx)
{
this->x = x;
this->y = y;
this->dir = dir;
this->idx = idx;
}
friend bool operator==(Ship s1, Ship s2)
{
return (s1.x == s2.x) && (s1.y == s2.y);
}
friend bool operator<(Ship& s1, Ship& s2)
{
if(s1.x != s2.x)
return s1.x < s2.x;
return s1.y < s2.y;
}
};
struct Collision
{
int t, idx1, idx2;
Collision(){};
Collision(int t, int idx1, int idx2)
{
this->t = t;
this->idx1 = idx1;
this->idx2 = idx2;
}
friend bool operator<(const Collision& c1, const Collision& c2)
{
return c1.t < c2.t;
}
};
int n;
Ship s[MAXN];
bool sunk[MAXN];
int stime[MAXN];
vector < Collision > colls;
map < char, int > mp;
map < int, vector < Ship > > diags;
bool lampa;
void read()
{
mp['W'] = 0;
mp['S'] = 1;
mp['E'] = 2;
mp['N'] = 3;
lampa = true;
cin >> n;
for(int i = 1; i <= n; i++)
{
char c;
cin >> s[i].x >> s[i].y >> c;
if(c == 'N' || c == 'W')
lampa = false;
s[i].dir = mp[c];
s[i].idx = i;
}
}
int get_time(int i, int j)
{
return (abs(s[i].x - s[j].x) + abs(s[i].y - s[j].y)) / 2;
}
Ship move(Ship& sh, int d)
{
Ship result = sh;
if(sh.dir == 0)
result.x -= d;
else if(sh.dir == 1)
result.y += d;
else if(sh.dir == 2)
result.x += d;
else
result.y -= d;
return result;
}
void solve()
{
for(int i = 1; i <= n; i++)
{
for(int j = i + 1; j <= n; j++)
{
int t = get_time(i, j);
if(move(s[i], t) == move(s[j], t))
colls.push_back(Collision(t, i, j));
}
}
sort(colls.begin(), colls.end());
for(Collision& coll : colls)
{
int t = coll.t;
int idx1 = coll.idx1;
int idx2 = coll.idx2;
if(sunk[idx1] && sunk[idx2])
continue;
if(!sunk[idx1] && !sunk[idx2])
{
sunk[idx1] = sunk[idx2] = true;
stime[idx1] = stime[idx2] = t;
continue;
}
if(sunk[idx1] && stime[idx1] == t)
{
sunk[idx2] = true;
stime[idx2] = t;
}
else if(sunk[idx2] && stime[idx2] == t)
{
sunk[idx1] = true;
stime[idx1] = t;
}
}
for(int i = 1; i <= n; i++)
{
if(!sunk[i])
{
cout << i << endl;
}
}
}
void solve6()
{
for(int i = 1; i <= n; i++)
{
diags[s[i].x + s[i].y].push_back(s[i]);
}
for(auto diag : diags)
{
int d = diag.first;
vector < Ship > ships = diag.second;
sort(ships.begin(), ships.end());
vector < int > st;
for(Ship& sh : ships)
{
if(sh.dir == 2)
{
st.push_back(sh.idx);
}
else if(!st.empty())
{
sunk[st.back()] = true;
sunk[sh.idx] = true;
st.pop_back();
}
}
}
for(int i = 1; i <= n; i++)
{
if(!sunk[i])
{
cout << i << endl;
}
}
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
read();
if(lampa)
solve6();
else
solve();
return 0;
}