#include <bits/stdc++.h>
using namespace std;
#define ff first
#define ss second
#define pb push_back
//#define int long long
int n,x[5005],y[5005];
char ch[5005];
int a[5005],b[5005],parent[5005],sz[5005],ans,vis[5005];
vector <pair <int,pair <int,int> > > vec;
void make_set(int x){
parent[x]=x;
sz[x]=1;
}
int find_set(int x){
if(parent[x]==x){
return x;
}
return parent[x]=find_set(parent[x]);
}
void union_sets(int x,int y){
x=find_set(x);
y=find_set(y);
if(x!=y){
if(sz[x]<sz[y]){
swap(x,y);
}
parent[y]=x;
sz[x]+=sz[y];
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
make_set(i);
cin>>x[i]>>y[i]>>ch[i];
if(ch[i]=='N'){
a[i]=0;
b[i]=-1;
continue;
}
if(ch[i]=='S'){
a[i]=0;
b[i]=1;
continue;
}
if(ch[i]=='E'){
a[i]=1;
b[i]=0;
continue;
}
if(ch[i]=='W'){
a[i]=-1;
b[i]=0;
continue;
}
}
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
if((a[j]==a[i] and x[j]!=x[i]) or (b[j]==b[i] and y[j]!=y[i]))continue;
int dx,dy;
if(a[i]==a[j]){
dx=INT_MAX;
}else{
dx=(x[i]-x[j])/(a[j]-a[i]);
}
if(b[i]==b[j]){
dy=INT_MAX;
}else{
dy=(y[i]-y[j])/(b[j]-b[i]);
}
if(dy<0 or dx<0){
continue;
}
if(dx==INT_MAX or dy==INT_MAX){
// cout<<i<<" "<<j<<" "<<dx<<" "<<dy<<endl;
vec.pb(make_pair(min(dx,dy),make_pair(i,j)));
continue;
}
if(dx!=dy){
continue;
}
// cout<<i<<" "<<j<<" "<<dx<<" "<<dy<<endl;
vec.pb(make_pair(min(dx,dy),make_pair(i,j)));
}
}
sort(vec.begin(),vec.end());
for(auto x:vec){
int u=x.ss.ff;
int v=x.ss.ss;
int c=x.ff;
if(c<=0){
assert(0);
}
if((vis[u]<c and vis[u]!=0) or (vis[v]<c and vis[v]!=0))continue;
// cout<<u<<" "<<v<<" "<<c<<endl;
vis[u]=c;
vis[v]=c;
union_sets(u,v);
}
for(int i=1;i<=n;i++){
if(sz[find_set(i)]==1){
cout<<i<<"\n";
}
}
}