#include <bits/stdc++.h>
using namespace std;
int N, C;
struct Edge {
  int u, v, cas;
} edg[2000010];
char str[10];
int f[2000010];
int head[2000010], v[2000010], w[2000010], prep[2000010], m0, son[2000010][2];
bool vis[2000010];
int find(int x) { return f[x] == x ? f[x] : f[x] = find(f[x]); }
void AddEdge(int a, int b, int c) {
  ++m0;
  v[m0] = b;
  w[m0] = c;
  prep[m0] = head[a];
  head[a] = m0;
}
bool cmp(Edge a, Edge b) {
  return a.cas > b.cas || a.cas == b.cas && a.v > b.v;
}
void Dfs(int now) {
  if (now == 0) return;
  if (vis[now]) {
    while (1)
      ;
  }
  vis[now] = 1;
  Dfs(son[now][0]);
  printf("%d ", now);
  Dfs(son[now][1]);
}
int main() {
  bool Flag = 0;
  int i, j, k;
  scanf("%d%d", &N, &C);
  for (i = 1; i <= N; ++i) f[i] = i;
  for (i = 1; i <= C; ++i) {
    scanf("%d%d%s", &edg[i].u, &edg[i].v, &str);
    if (edg[i].u >= edg[i].v) Flag = 1;
    if (str[0] == 'R') edg[i].cas = 1;
  }
  sort(edg + 1, edg + C + 1, cmp);
  for (i = 1; i <= C; ++i) {
    AddEdge(edg[i].u, edg[i].v, edg[i].cas);
  }
  for (i = N; i; --i) {
    if (Flag) break;
    bool flag = 0;
    for (j = head[i]; j; j = prep[j]) {
      if (w[j]) {
        if (!flag) {
          flag = 1;
          if (find(v[j]) == i) {
            Flag = 1;
            break;
          }
          for (k = find(v[j]); k != i; k = find(k)) {
            if (find(k - 1) == i) {
              son[i][1] = k;
              f[k] = find(k - 1);
            } else {
              son[k - 1][1] = k;
              f[k] = find(k - 1);
            }
          }
        }
      }
      if (!w[j]) son[i][0] = i + 1;
      for (k = find(v[j]); k != i; k = find(k)) {
        if (k - 1 != i) son[k - 1][1] = k;
        f[k] = k - 1;
      }
    }
    if (Flag) break;
  }
  if (Flag)
    puts("IMPOSSIBLE");
  else {
    for (i = 1; i <= N; ++i)
      if (!vis[i]) Dfs(i);
    puts("");
  }
  return 0;
}
