#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;
}