#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:100000000000000")
using namespace std;
int n, m, mx[1000011], mi[1000011];
string st;
vector<pair<int, int> > adj[1000011];
int can, vis[1000011];
void MAX_MIN(int p) {
  if (vis[p] == 1) {
    can = 0;
    return;
  }
  if (vis[p] == 2) return;
  vis[p] = 1;
  int l = mx[p], r = mi[p];
  for (int i = 0; i < adj[p].size(); i++) {
    int x = adj[p][i].first;
    MAX_MIN(x);
    l = max(l, mx[x]);
    r = min(r, mi[x]);
  }
  mx[p] = l, mi[p] = r;
  vis[p] = 2;
}
void check(int p) {
  if (mi[p] < p) can = 0;
  int l = -1, r = 1000000007;
  for (int i = 0; i < adj[p].size(); i++) {
    int x = adj[p][i].first, bl = adj[p][i].second;
    if (bl == 0)
      l = max(l, mx[x]);
    else
      r = min(r, mi[x]);
  }
  if (l >= r) can = 0;
}
int cur = 1, mxad[1000011][2];
pair<int, int> adj2[1000011];
void build(int p) {
  for (int i = 0; i < adj[p].size(); i++) {
    if (adj[p][i].second == 0) {
      while (cur <= adj[p][i].first) {
        if (adj2[p].first == -1) {
          int t = cur;
          adj2[p].first = cur++;
          build(t);
          mxad[p][0] = max(mxad[t][0], mxad[t][1]);
        } else {
          int t = cur;
          adj2[mxad[p][0]].first = cur++;
          build(t);
          mxad[p][0] = max(mxad[t][0], mxad[t][1]);
        }
      }
    } else {
      if (mxad[p][0] > adj[p][i].first) {
        can = 0;
        return;
      }
      while (cur <= adj[p][i].first) {
        if (adj2[p].second == -1) {
          int t = cur;
          adj2[p].second = cur++;
          build(t);
          mxad[p][1] = max(mxad[t][0], mxad[t][1]);
        } else {
          int t = cur;
          adj2[mxad[p][1]].first = cur++;
          build(t);
          mxad[p][1] = max(mxad[t][0], mxad[t][1]);
        }
      }
    }
  }
}
vector<int> ans;
void DFS(int p) {
  if (p == -1) return;
  DFS(adj2[p].first);
  ans.push_back(p + 1);
  DFS(adj2[p].second);
}
int main() {
  can = 1;
  memset((adj2), (-1), sizeof(adj2));
  cin >> n >> m;
  for (int i = 0; i < n; i++) mx[i] = i, mi[i] = i, mxad[i][0] = mxad[i][1] = i;
  int a, b;
  for (int i = 0; i < m; i++) {
    cin >> a >> b >> st;
    a--, b--;
    if (st == "LEFT")
      adj[a].push_back(make_pair(b, 0));
    else
      adj[a].push_back(make_pair(b, 1));
  }
  for (int i = 0; i < n; i++)
    if (!vis[i]) {
      MAX_MIN(i);
    }
  if (!can) {
    printf("IMPOSSIBLE");
    return 0;
  }
  for (int i = 0; i < n; i++) {
    sort((adj[i]).begin(), (adj[i]).end());
    check(i);
  }
  if (!can) {
    printf("IMPOSSIBLE");
    return 0;
  }
  build(0);
  while (cur < n) {
    adj2[cur - 1].first = cur++;
    build(cur - 1);
  }
  if (!can) {
    printf("IMPOSSIBLE");
    return 0;
  }
  DFS(0);
  if (ans.size() != n) {
    printf("IMPOSSIBLE");
    return 0;
  }
  for (int i = 0; i < n; i++) cout << ans[i] << ' ';
  return 0;
}
