#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
#include<cmath>
using namespace std;
int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
const int maxn=4e6+5;
int n,m,n2;
int h[maxn],to[maxn],nxt[maxn],tot;
void ade(int x,int y){
to[++tot]=y; nxt[tot]=h[x]; h[x]=tot;
}
int dfn[maxn],cnt,low[maxn],stk[maxn],top;
bool vis[maxn],out[maxn];
int col[maxn];
void trj(int f,int u){
low[u]=dfn[u]=++cnt;
vis[u]=true;
stk[++top]=u;
for(int i=h[u];i;i=nxt[i]){
int v=to[i];
if(!vis[v]){
trj(u,v);
low[u]=min(low[u],low[v]);
}else if(!out[v]) low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u]){
out[u]=true;
col[u]=++col[0];
while(stk[top]!=u){
int c=stk[top];
out[c]=true;
col[c]=col[0];
top--;
}
top--;
}
}
int id(int x,int op){
return x+op*n;
}
int ans[maxn];
int main(){
n=read(); m=read(); n2=n<<1;
for(int i=1;i<=m;i++){
int x=read(),a=read(),y=read(),b=read();
ade(id(x,a^1),id(y,b));
ade(id(y,b^1),id(x,a));
}
for(int i=1;i<=n2;i++){
if(!vis[i]) trj(0,i);
}
for(int i=1;i<=n;i++){
if(col[i]==col[i+n]){
printf("IMPOSSIBLE");
return 0;
}
if(col[i]>col[i+n]) ans[i]=1;
}
printf("POSSIBLE\n");
for(int i=1;i<=n;i++) printf("%d ",ans[i]);
return 0;
}