提交记录
#include<bits/stdc++.h>
#define FL(i,a,b) for(int i=(a);i<=(b);i++)
#define FR(i,a,b) for(int i=(a);i>=(b);i--)
#define ll long long
using namespace std;
const int MAXN = 2e6 + 10;
const int MAXM = 2e6 + 10;
int n,m,cnt=0,tot=0,top=0,sum=0;
int head[MAXN],sd[MAXN],dfn[MAXN],low[MAXN];
int s[MAXN],vis[MAXN];
struct node{
int u,v,nxt;
}e[MAXM];
void add_edge(int x,int y){
e[++cnt].nxt=head[x];
e[cnt].u=x;
e[cnt].v=y;
head[x]=cnt;
}
void tarjan(int x){
low[x]=dfn[x]=++tot;
s[++top]=x;
vis[x]=1;
for(int i=head[x];i;i=e[i].nxt){
int v=e[i].v;
if(!dfn[v]){
tarjan(v);
low[x]=min(low[x],low[v]);
}
else if (vis[v]){
low[x]=min(low[x],low[v]);
}
}
if(dfn[x]==low[x]){
int y;
while(s[top]){
int y=s[top--];
sd[y]=x;
vis[y]=0;
if(x==y) break;
}
}
}
int main(){
scanf("%d%d",&n,&m);
FL(i,1,m){
int x,a,y,b;
scanf("%d%d%d%d",&x,&a,&y,&b);
if(a==0&&b==0){
add_edge(x,y+n);
add_edge(y,x+n);
}
else if(a==0&&b==1){
add_edge(x,y);
add_edge(y+n,x+n);
}
else if(a==1&&b==0){
add_edge(x+n,y+n);
add_edge(y,x);
}
else if(a==1&&b==1){
add_edge(x+n,y);
add_edge(y+n,x);
}
}
FL(i,1,2*n){
if(!dfn[i]) tarjan(i);
}
FL(i,1,n){
if(sd[i]==sd[i+n]){
printf("IMPOSSIBLE\n");
return 0;
}
}
printf("POSSIBLE\n");
FL(i,1,n){
if(sd[i+n]>sd[i]) printf("1 ");
else printf("0 ");
}
return 0;
}