#include <cstdio>
#define For(x) for(int i=hd[x];i;i=e[i].nxt)
#define v (e[i].to)
typedef long long ll;
const int N=1e6+5;
int n,m,x,y,a,b,num,hd[N<<1];
struct cz {
int nxt,to;
}e[N<<1];
int dfn[N<<1],low[N<<1],cnt,st[N<<1],pos[N<<1];
bool vis[N<<1];
inline int read() {
int x=0,flag=0;char ch=getchar();
while(ch<'0'||ch>'9'){flag|=(ch=='-');ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return flag?-x:x;
}
inline int mx(int x,int y) {return x>y?x:y;}
inline int mn(int x,int y) {return x<y?x:y;}
inline void add(int x,int y) {
e[++num]=(cz) {hd[x],y};
hd[x]=num;
}
void dfs(int u) {//tarjan
dfn[u]=low[u]=++cnt;
st[++st[0]]=u; vis[u]=1;
For(x) {
if(!dfn[v]) {
dfs(v);
low[u]=mn(low[u],low[v]);
} else if(vis[v])
low[u]=mn(low[u],dfn[v]);
}
if(dfn[u]==low[u]) {
++pos[0];
while(st[st[0]]!=u)
vis[st[st[0]]]=0,
pos[st[st[0]--]]=pos[0];
vis[st[st[0]]]=0;
pos[st[st[0]--]]=pos[0];
}
}
int main() {
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
n=read();m=read();
for(int i=1;i<=m;++i) {
x=read();a=read();y=read();b=read();
if(a==1&&b==1) add(x,y+n),add(y,x+n);
if(a==0&&b==1) add(x+n,y+n),add(y,x);
if(a==1&&b==0) add(x,y),add(y+n,x+n);
if(a==0&&b==0) add(x+n,y),add(y+n,x);
}
for(int i=1;i<=n*2;++i)
if(!dfn[i]) dfs(i);
for(int i=1;i<=n;++i)
if(pos[i]==pos[i+n]) {
printf("IMPOSSIBLE\n");
return 0;
}
printf("POSSIBLE\n");
for(int i=1;i<=n;++i)
if(pos[i]<pos[i+n]) printf("0 ");
else printf("1 ");
return 0;
}
将近两年没求助过人了,今天学2-SAT实在无奈,第一次实现模板这么吃力。