#include<iostream>
#include<cstdio>
#include<stack>
using namespace std;
int n,m;
struct node{
int v,nxt;
}a[4001000];
int num,head[1001000];
int dfn[1001000],low[1001000],id,cnt,c[1001000],inst[1001000];
int st[1001000],top;
void add(int u,int v){
a[++num].v=v;
a[num].nxt=head[u];
head[u]=num;
}
void tarjan(int u){
dfn[u]=low[u]=++id;
st[++top]=u;
inst[u]=1;
for(int i=head[u];i;i=a[i].nxt){
int v=a[i].v;
if(!dfn[v]){
tarjan(v);
low[u]=min(low[u],low[v]);
}else if(inst[v]){
low[u]=min(low[u],dfn[v]);
}
}
if(dfn[u]==low[u]){
int t=0;
cnt++;
while(t!=u){
t=st[top--];
c[t]=cnt;
inst[t]=0;
}
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int u,a,v,b;
scanf("%d%d%d%d",&u,&a,&v,&b);
if(a==0&&b==0){
add(u+n,v);
add(v+n,u);
}
if(a==0&&b==1){
add(u+n,v+n);
add(v,u);
}
if(a==1&&b==0){
add(u,v);
add(v+n,u+n);
}
if(a==1&&b==1){
add(u,v+n);
add(v,u+n);
}
}
for(int i=1;i<=2*n;i++){
if(!dfn[i]){
tarjan(i);
}
}
for(int i=1;i<=n;i++){
if(c[i]==c[i+n]){
printf("IMPOSSIBLE");
return 0;
}
}
printf("POSSIBLE\n");
for(int i=1;i<=n;i++){
printf("%d ",c[i]>c[i+n]);
}
return 0;
}