Link to this code: https://cses.fi/paste/5fe0dc7cc8f10b157cb1b6/
#include<bits/stdc++.h>
using namespace std;
int n,m,cnt;
char c1,c2;
 
vector<int> graph[1<<18],hparg[1<<18],topo,scc(1<<18);
bitset<(1<<18)> vis,ans;

void dfs(int now){
    vis[now]=1;
    for(const int& i:graph[now])if(!vis[i])dfs(i);
    topo.emplace_back(now);
}
 
inline void sfd(int now){
    scc[now]=cnt;
    for(const int& i:hparg[now])if(!scc[i])sfd(i);
}
 
int main(){
    cin.tie(nullptr)->sync_with_stdio(0),cout.tie(0);
    cin>>n>>m;
    for(int i = 0,a,b;i<n;i++){
        cin>>c1>>a>>c2>>b;
        if (c1=='-')a=2*m-a+1;
        if (c2=='-')b=2*m-b+1;
        graph[2*m-a+1].emplace_back(b), graph[2*m-b+1].emplace_back(a);
        hparg[a].emplace_back(2*m-b+1), hparg[b].emplace_back(2*m-a+1);
    }
    for(int i = 1;i<=2*m;i++)if(!vis[i])dfs(i);
    for(auto it=topo.rbegin();it!=topo.rend();it++)if(!scc[*it])++cnt,sfd(*it);
    for(int i = 1;i<=m;i++){
        if(scc[i]==scc[2*m-i+1])return cout<<"IMPOSSIBLE",0;
        ans[i]=(scc[i]>scc[2*m-i+1]);
    }
    for(int i = 1;i<=m;i++)cout<<(ans[i]?"+ ":"- ");
}