func_code_string: #include <bits/stdc++.h>   using namespace std;   template <class T>   bool uin(T &a, T b) {     if (a > b) {       a = b;       return true;     }     return false;   }   template <class T>   bool uax(T &a, T b) {     if (a < b) {       a = b;       return true;     }     return false;   }   const int MAXN = 1100000;   vector<int> lft[MAXN], rgt[MAXN];   int leftf[MAXN], anyf[MAXN];   int lc[MAXN], rc[MAXN];   char s[10];   struct TNode {     int left, right;     int L, R;     int maxk;     TNode(int L = -1, int R = -1) : left(-1), right(-1), L(L), R(R), maxk(-1e9) {}   };   const int MAXT = 2100000;   TNode t[MAXT];   int tc = 0;   int buildTree(int L, int R) {     int node = tc++;     t[node] = TNode(L, R);     if (R - L == 1) return node;     int M = (L + R) / 2;     t[node].left = buildTree(L, M);     t[node].right = buildTree(M, R);     return node;   }   int getMax(int node, int L, int R) {     if (max(L, t[node].L) >= min(R, t[node].R)) return -1e9;     if (L <= t[node].L && t[node].R <= R) return t[node].maxk;     return max(getMax(t[node].left, L, R), getMax(t[node].right, L, R));   }   void setMax(int node, int i, int x) {     if (i >= t[node].R || i < t[node].L) return;     if (i == t[node].L && i + 1 == t[node].R) {       t[node].maxk = x;       return;     }     setMax(t[node].left, i, x);     setMax(t[node].right, i, x);     t[node].maxk = max(t[t[node].left].maxk, t[t[node].right].maxk);   }   bool buildAns(int l, int r) {     if (anyf[l] > r) return false;     for (int x : rgt[l]) {       if (x <= leftf[l]) return false;     }     if (leftf[l] == l) {       lc[l] = -1;       if (r == l) return true;       rc[l] = l + 1;       return buildAns(l + 1, r);     }     lc[l] = l + 1;     if (!buildAns(lc[l], leftf[l])) return false;     if (leftf[l] == r) return true;     rc[l] = leftf[l] + 1;     return buildAns(rc[l], r);   }   void print(int v) {     if (v == -1) return;     print(lc[v]);     printf( %d  , v + 1);     print(rc[v]);   }   int main() {     ios::sync_with_stdio(false);     cin.tie(nullptr);     cout.precision(10);     cout << fixed;     int N, C;     scanf( %d%d , &N, &C);     bool ok = true;     int root = buildTree(0, N);     for (int i = 0; i < (int)(C); ++i) {       int x, y;       scanf( %d%d%s , &x, &y, s);       --x;       --y;       ok &= x < y;       if (s[0] ==  L )         lft[x].push_back(y);       else         rgt[x].push_back(y);     }     if (!ok) {       cout <<  IMPOSSIBLE n ;       return 0;     }     for (int i = (int)(N)-1; i >= 0; --i) {       leftf[i] = anyf[i] = i;       for (int x : lft[i]) {         uax(leftf[i], getMax(root, i, x + 1));       }       for (int x : rgt[i]) {         uax(anyf[i], getMax(root, i, x + 1));       }       uax(anyf[i], leftf[i]);       setMax(root, i, anyf[i]);     }     for (int i = 0; i < (int)(N); ++i) lc[i] = rc[i] = -1;     if (!buildAns(0, N - 1)) {       cout <<  IMPOSSIBLE n ;       return 0;     }     print(0);     printf(  n );     return 0;   }   