#include <bits/stdc++.h>
using namespace std;
typedef struct node {
  int left, right, m;
};
node tree1[2100000];
char s[9];
int x, y, ans[1000010], fleft[1000010], fright[1000010], fur[1000010], t = 0;
int i, n, m;
void build1(int l, int r, int d) {
  if (l == r)
    tree1[d].m = fur[l];
  else {
    t++;
    tree1[d].left = t;
    build1(l, (l + r) / 2, t);
    t++;
    tree1[d].right = t;
    build1((l + r) / 2 + 1, r, t);
    tree1[d].m = max(tree1[tree1[d].left].m, tree1[tree1[d].right].m);
  }
  return;
}
int cal1(int lv, int rv, int l, int r, int d) {
  if (lv <= l && rv >= r)
    return tree1[d].m;
  else if (lv > r || rv < l)
    return 0;
  else
    return max(cal1(lv, rv, l, (l + r) / 2, tree1[d].left),
               cal1(lv, rv, (l + r) / 2 + 1, r, tree1[d].right));
}
void find(int l, int r) {
  if (l > r) return;
  if (l == r) {
    ans[++t] = l;
    return;
  }
  if (fleft[l] == 0) {
    ans[++t] = l;
    find(l + 1, r);
  } else {
    int mostleft = fleft[l];
    while (1) {
      int temp = cal1(l + 1, mostleft, 1, n, 0);
      if (temp <= mostleft)
        break;
      else
        mostleft = temp;
    }
    if (fright[l] <= mostleft) {
      cout << "IMPOSSIBLE\n";
      exit(0);
    } else {
      find(l + 1, mostleft);
      ans[++t] = l;
      find(mostleft + 1, r);
    }
  }
}
int main() {
  cin >> n >> m;
  memset(fleft, 0, sizeof(fleft));
  memset(fright, 1, sizeof(fright));
  for (i = 0; i < m; i++) {
    scanf("%d%d%s", &x, &y, s);
    if (x >= y) {
      cout << "IMPOSSIBLE\n";
      return 0;
    }
    if (s[0] == 'L')
      fleft[x] = max(fleft[x], y);
    else
      fright[x] = min(fright[x], y);
    fur[x] = max(fur[x], y);
  }
  memset(tree1, 0, sizeof(tree1));
  t = 0;
  build1(1, n, 0);
  t = 0;
  find(1, n);
  for (i = 1; i < n; i++) printf("%d ", ans[i]);
  printf("%d\n", ans[n]);
  return 0;
}
