#include <bits/stdc++.h>
using namespace std;
long long gcd(long long a, long long b) {
  long long r;
  while (b != 0) {
    r = a % b;
    a = b;
    b = r;
  }
  return a;
}
long long lcm(long long a, long long b) { return a / gcd(a, b) * b; }
long long fpow(long long n, long long k, int p = (int)1e9 + 7) {
  long long r = 1;
  for (; k; k >>= 1) {
    if (k & 1) r = r * n % p;
    n = n * n % p;
  }
  return r;
}
const int MOD = (int)1e9 + 7;
const int INF = (int)1e9;
const long long LINF = (long long)1e18;
const long double PI = 2 * acos((long double)0);
const int maxn = 1000010;
int n, c;
int lmin[maxn];
int lmax[maxn];
int rmin[maxn];
int rmax[maxn];
vector<int> ans;
int st[4 * maxn];
void build(int node, int L, int R) {
  if (L == R) {
    st[node] = max(lmax[L], rmax[L]);
    return;
  }
  build(node << 1, L, (L + R) >> 1);
  build((node << 1) + 1, ((L + R) >> 1) + 1, R);
  st[node] = max(st[node << 1], st[(node << 1) + 1]);
}
int query(int node, int l, int r, int L, int R) {
  if (l > R || r < L) return -1;
  if (l <= L && r >= R) return st[node];
  return max(query(node << 1, l, r, L, (L + R) >> 1),
             query((node << 1) + 1, l, r, ((L + R) >> 1) + 1, R));
}
int go(int from, int to) {
  if (from > to) return 1;
  if (from == to) {
    ans.push_back(from);
    return 1;
  }
  for (int i = (max(from + 1, lmax[from])); i < (min(to + 1, rmin[from]));
       i++) {
    if (query(1, from + 1, i, 0, n - 1) <= i) {
      if (!go(from + 1, i)) return 0;
      ans.push_back(from);
      if (!go(i + 1, to)) return 0;
      return 1;
    }
  }
  if (lmax[from] < 0) {
    ans.push_back(from);
    if (go(from + 1, to)) return 1;
  }
  return 0;
}
void solve() {
  memset(lmin, 0x3f, sizeof(lmin));
  memset(lmax, -1, sizeof(lmax));
  memset(rmin, 0x3f, sizeof(rmin));
  memset(rmax, -1, sizeof(rmax));
  scanf("%d%d", &n, &c);
  for (int i = (0); i < (c); i++) {
    int u, v;
    char dir[10];
    scanf("%d%d%s", &u, &v, dir);
    u--;
    v--;
    if (u >= v) {
      printf("IMPOSSIBLE");
      return;
    }
    if (dir[0] == 'L') {
      lmin[u] = min(lmin[u], v);
      lmax[u] = max(lmax[u], v);
    } else {
      rmin[u] = min(rmin[u], v);
      rmax[u] = max(rmax[u], v);
    }
  }
  build(1, 0, n - 1);
  if (!go(0, n - 1))
    printf("IMPOSSIBLE");
  else {
    for (int i = (0); i < (int((ans).size())); i++) printf("%d ", ans[i] + 1);
  }
}
int main() {
  solve();
  return 0;
}
