#include <bits/stdc++.h>
using namespace std;
const int L_N = 1e5 + 10;
int N, M;
const int INF = 1e8;
struct node {
  int l_mi, l_mx;
  int r_mi, r_mx;
  int l, r;
  node() { l_mi = r_mi = INF; }
} t[L_N];
void cant() {
  printf("IMPOSSIBLE\n");
  exit(0);
}
int st[L_N][20];
int rmq(int l, int r) {
  if (l > r) return 0;
  int ret = 0;
  for (int k = 19; k >= 0; k--) {
    int x = l + (1 << k);
    if (x <= r + 1) ret = max(ret, st[l][k]), l = x;
  }
  return ret;
}
void solve(int u, int l, int r) {
  if (l > r) return;
  int l_need = l - 1;
  if (t[u].l_mx) l_need = rmq(l, t[u].l_mx);
  if (l_need >= t[u].r_mi) cant();
  if (l_need > r) printf("bug!!\n");
  if (l_need >= l) t[u].l = u + 1, solve(u + 1, l + 1, l_need);
  if (l_need < r) t[u].r = l_need + 1, solve(l_need + 1, l_need + 2, r);
}
void dfs(int u) {
  if (t[u].l) dfs(t[u].l);
  printf("%d ", u);
  if (t[u].r) dfs(t[u].r);
}
int main() {
  scanf("%d %d", &N, &M);
  for (int i = 1; i <= M; i++) {
    int a, b;
    scanf("%d %d", &a, &b);
    char dir[10];
    scanf("%s", dir);
    if (a >= b) cant();
    if (dir[0] == 'L') {
      t[a].l_mi = min(t[a].l_mi, b);
      t[a].l_mx = max(t[a].l_mx, b);
    } else {
      t[a].r_mi = min(t[a].r_mi, b);
      t[a].r_mx = max(t[a].r_mx, b);
    }
  }
  for (int i = N; i >= 1; i--) {
    int mx = max(i, max(t[i].l_mx, t[i].r_mx));
    mx = max(mx, rmq(i + 1, mx));
    st[i][0] = mx;
    for (int k = 1; k < 20; k++) {
      st[i][k] = st[i][k - 1];
      if (i + (1 << (k - 1)) <= N)
        st[i][k] = max(st[i][k - 1], st[i + (1 << (k - 1))][k - 1]);
    }
  }
  solve(1, 2, N);
  dfs(1);
  return 0;
}
