#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 = 1e6 + 10;
struct node{
int v,nxt;
}e[MAXN<<2];
int head[MAXN<<1],low[MAXN<<1],dfn[MAXN<<1],s[MAXN<<1],scc[MAXN<<1];
bool in[MAXN<<1];
int cnt=0,tot=0,top=0,num=0;
int n,m;
void add(int u,int v){
e[++cnt].v=v;
e[cnt].nxt=head[u];
head[u]=cnt;
}
void tarjan(int u){
low[u]=dfn[u]=++tot;
s[top++]=u;
in[u]=1;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].v;
if(!dfn[v]){
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(in[v]) low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u]){
int v;
num++;
while(u!=v){
v=s[--top];
in[v]=0;
scc[v]=num;
}
}
}
bool calc(){
FL(i,1,2*n)
if(!dfn[i]) tarjan(i);
FL(i,1,n)
if(scc[i]==scc[i+n]) return 0;
return 1;
}
int main(){
scanf("%d%d",&n,&m);
FL(i,1,m){
int a,b,x,y;
scanf("%d%d%d%d",&a,&x,&b,&y);
add(a+(x^1)*n,b+y*n);
add(b+(y^1)*n,a+x*n);
}
if(calc()){
printf("POSSIBLE\n");
FL(i,1,n) printf("%d ",(scc[i]>scc[i+n]));
}
else printf("IMPOSSIBLE\n");
return 0;
}