func_code_string: #include <bits/stdc++.h>   using namespace std;   int const N = 1000000;   int n, m;   vector<vector<pair<int, int> > > adj;   bool valid;   int ans[N];   int cnt;   int st[N * 3];   void readin() {     int u, v;     char b[10];     scanf( %d%d , &n, &m);     valid = true;     adj.clear();     adj.resize(n + 1);     for (int i = 0; i < m; ++i) {       scanf( %d%d%s , &u, &v, b);       if (v <= u) {         valid = false;       }       adj[u].push_back(make_pair(v, b[0] ==  L  ? 0 : 1));     }   }   inline int lc(int root) { return root << 1; }   inline int rc(int root) { return (root << 1) | 1; }   void init_st(int root, int l, int r) {     if (l == r) {       st[root] = l;       return;     }     int mid = (l + r) >> 1;     init_st(lc(root), l, mid);     init_st(rc(root), mid + 1, r);     st[root] = max(st[lc(root)], st[rc(root)]);   }   void update_st(int root, int l, int r, int x, int v) {     if (l == r) {       st[root] = v;       return;     }     int mid = (l + r) >> 1;     if (x <= mid) {       update_st(lc(root), l, mid, x, v);     } else {       update_st(rc(root), mid + 1, r, x, v);     }   }   int query_st(int root, int l, int r, int x, int y) {     if (l == r) {       return st[root];     }     int mid = (l + r) >> 1;     if (y <= mid) {       return query_st(lc(root), l, mid, x, y);     } else if (x > mid) {       return query_st(rc(root), mid + 1, r, x, y);     } else {       return max(query_st(lc(root), l, mid, x, mid),                  query_st(rc(root), mid + 1, r, mid + 1, y));     }   }   bool build(int root, int limit) {     if (root > limit) {       return true;     }     int l_max = 0, r_min = INT_MAX;     for (vector<pair<int, int> >::const_iterator it = adj[root].begin();          it != adj[root].end(); ++it) {       if (it->second == 0) {         l_max = max(l_max, query_st(1, 1, n, root + 1, it->first));       } else {         r_min = min(r_min, it->first);       }     }     if (l_max == 0) {       ans[cnt++] = root;       return build(root + 1, limit);     } else if (r_min == INT_MAX) {       bool ret = build(root + 1, limit);       ans[cnt++] = root;       return ret;     } else {       if (l_max >= r_min) {         return false;       }       bool ret = true;       ret = ret && build(root + 1, l_max);       ans[cnt++] = root;       ret = ret && build(l_max + 1, limit);       return ret;     }   }   void solve() {     if (!valid) {       printf( IMPOSSIBLE n );       return;     }     init_st(1, 1, n);     for (int i = n; i >= 1; --i) {       int u = i;       for (vector<pair<int, int> >::const_iterator it = adj[i].begin();            it != adj[i].end(); ++it) {         u = max(u, it->first);       }       update_st(1, 1, n, i, query_st(1, 1, n, i, u));     }     cnt = 0;     if (build(1, n)) {       for (int i = 0; i < n; ++i) {         printf( %d%c , ans[i], i < n - 1 ?     :   n );       }     } else {       printf( IMPOSSIBLE n );     }   }   int main() {     readin();     solve();     return 0;   }   