#include <bits/stdc++.h>
using namespace std;
template <class T>
bool uin(T &a, T b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
template <class T>
bool uax(T &a, T b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
const int MAXN = 1100000;
vector<int> lft[MAXN], rgt[MAXN];
int leftf[MAXN], anyf[MAXN];
int lc[MAXN], rc[MAXN];
char s[10];
struct TNode {
  int left, right;
  int L, R;
  int maxk;
  TNode(int L = -1, int R = -1) : left(-1), right(-1), L(L), R(R), maxk(-1e9) {}
};
const int MAXT = 2100000;
TNode t[MAXT];
int tc = 0;
int buildTree(int L, int R) {
  int node = tc++;
  t[node] = TNode(L, R);
  if (R - L == 1) return node;
  int M = (L + R) / 2;
  t[node].left = buildTree(L, M);
  t[node].right = buildTree(M, R);
  return node;
}
int getMax(int node, int L, int R) {
  if (max(L, t[node].L) >= min(R, t[node].R)) return -1e9;
  if (L <= t[node].L && t[node].R <= R) return t[node].maxk;
  return max(getMax(t[node].left, L, R), getMax(t[node].right, L, R));
}
void setMax(int node, int i, int x) {
  if (i >= t[node].R || i < t[node].L) return;
  if (i == t[node].L && i + 1 == t[node].R) {
    t[node].maxk = x;
    return;
  }
  setMax(t[node].left, i, x);
  setMax(t[node].right, i, x);
  t[node].maxk = max(t[t[node].left].maxk, t[t[node].right].maxk);
}
bool buildAns(int l, int r) {
  if (anyf[l] > r) return false;
  for (int x : rgt[l]) {
    if (x <= leftf[l]) return false;
  }
  if (leftf[l] == l) {
    lc[l] = -1;
    if (r == l) return true;
    rc[l] = l + 1;
    return buildAns(l + 1, r);
  }
  lc[l] = l + 1;
  if (!buildAns(lc[l], leftf[l])) return false;
  if (leftf[l] == r) return true;
  rc[l] = leftf[l] + 1;
  return buildAns(rc[l], r);
}
void print(int v) {
  if (v == -1) return;
  print(lc[v]);
  printf("%d ", v + 1);
  print(rc[v]);
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.precision(10);
  cout << fixed;
  int N, C;
  scanf("%d%d", &N, &C);
  bool ok = true;
  int root = buildTree(0, N);
  for (int i = 0; i < (int)(C); ++i) {
    int x, y;
    scanf("%d%d%s", &x, &y, s);
    --x;
    --y;
    ok &= x < y;
    if (s[0] == 'L')
      lft[x].push_back(y);
    else
      rgt[x].push_back(y);
  }
  if (!ok) {
    cout << "IMPOSSIBLE\n";
    return 0;
  }
  for (int i = (int)(N)-1; i >= 0; --i) {
    leftf[i] = anyf[i] = i;
    for (int x : lft[i]) {
      uax(leftf[i], getMax(root, i, x + 1));
    }
    for (int x : rgt[i]) {
      uax(anyf[i], getMax(root, i, x + 1));
    }
    uax(anyf[i], leftf[i]);
    setMax(root, i, anyf[i]);
  }
  for (int i = 0; i < (int)(N); ++i) lc[i] = rc[i] = -1;
  if (!buildAns(0, N - 1)) {
    cout << "IMPOSSIBLE\n";
    return 0;
  }
  print(0);
  printf("\n");
  return 0;
}
