#include <bits/stdc++.h>
using namespace std;
const int MN = 1000111;
int n, q;
bool hasLeft[MN], hasRight[MN];
pair<int, int> _left[MN], _right[MN];
bool can;
vector<int> ans;
int dfs(int u, int max_child) {
  if (!can) return -1;
  max_child = max(max_child, max(_left[u].second, _right[u].second));
  if (u == max_child) {
    ans.push_back(u);
    return u;
  }
  if (!hasLeft[u]) {
    ans.push_back(u);
    return dfs(u + 1, max_child);
  }
  if (!hasRight[u]) {
    int res = dfs(u + 1, max_child);
    ans.push_back(u);
    return res;
  }
  int max_left = dfs(u + 1, _left[u].second);
  if (max_left >= _right[u].first) {
    can = false;
    return -1;
  }
  ans.push_back(u);
  dfs(max_left + 1, max_child);
}
int main() {
  ios ::sync_with_stdio(false);
  cout << (fixed) << setprecision(9);
  while (cin >> n >> q) {
    for (int i = (1), _b = (n); i <= _b; i++) {
      hasLeft[i] = hasRight[i] = false;
      _left[i] = _right[i] = make_pair(n + 1, -1);
    }
    can = true;
    for (int i = (1), _b = (q); i <= _b; i++) {
      int u, v;
      string s;
      cin >> u >> v >> s;
      if (u >= v) {
        can = false;
      }
      if (s[0] == 'L') {
        hasLeft[u] = true;
        _left[u].first = min(_left[u].first, v);
        _left[u].second = max(_left[u].second, v);
      } else {
        hasRight[u] = true;
        _right[u].first = min(_right[u].first, v);
        _right[u].second = max(_right[u].second, v);
      }
    }
    for (int u = (1), _b = (n); u <= _b; u++) {
      if (_left[u].second >= _right[u].first) {
        can = false;
        break;
      }
    }
    ans.clear();
    if (can) dfs(1, n);
    if (!can)
      cout << "IMPOSSIBLE" << endl;
    else {
      for (auto x : ans) cout << x << ' ';
      cout << endl;
    }
  }
  return 0;
}
