#include<stdio.h>
#include<bits/stdc++.h>
#define min(a,b) ((a)<(b)?(a):(b))
using namespace std;
const int N=2e6+5;
int n,m,k,tot,cnt,i,a,j,b;
int head[N],dfn[N],low[N],belong[N];
bool vis[N];
struct edge{
int v,next;
}e[N<<1];
stack<int>s;
inline void add(int u,int v)
{
e[++k]=(edge){v,head[u]};
head[u]=k;
}
void tarjan(int u)
{
int v=0;
dfn[u]=low[u]=++tot;
s.push(u),vis[u]=true;
for(register int i=head[u];i;i=e[i].next)
if(!dfn[v=e[i].v])
{
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(vis[v]) low[u]=min(low[u],dfn[v]);
if(low[u]==dfn[u])
{
++cnt;
while(v!=u)
{
v=s.top();
s.pop();
belong[v]=cnt;
vis[v]=false;
}
}
}
int main(void)
{
scanf("%d%d",&n,&m);
while(m--)
{
scanf("%d%d%d%d",&i,&a,&j,&b);
add(i+(a&1)*n,j+(b^1)*n),add(j+(b&1)*n,i+(a^1)*n);
}
for(register int i=1;i<=n<<1;++i)
if(!dfn[i]) tarjan(i);
for(register int i=1;i<=n;++i)
if(belong[i]==belong[i+n]) return !printf("IMPOSSIBLE\n");
puts("POSSIBLE");
for(register int i=1;i<=n;++i)
printf("%d ",belong[i]<belong[i+n]);
return 0;
}