#include<bits/stdc++.h>
using namespace std;
const int mxn=4e6+10;
int head[mxn],cnt,cnt2,col,n,m,dfn[mxn],low[mxn],be[mxn];
bool vis[mxn];
stack<int>st;
struct node{
int to,nxt;
}edge[mxn];
void add(int u,int v){
edge[++cnt]=(node){v,head[u]};
head[u]=cnt;
}
void tarjan(int u){
dfn[u]=low[u]=++cnt2;
st.push(u);vis[u]=1;
for(int i=head[u];i;i=edge[i].nxt){
int v=edge[i].to;
if(!dfn[v]){
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(vis[v])low[u]=min(low[u],dfn[u]);
}
if(dfn[u]==low[u]){
col++;
while(st.top()!=u){
be[st.top()]=col;
vis[st.top()]=0;
st.pop();
}
be[st.top()]=col;
vis[st.top()]=0;
st.pop();
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int x,y,a,b;
scanf("%d%d%d%d",&x,&a,&y,&b);
add(x+n*a,y+n*(b^1));
add(y+n*b,x+n*(a^1));
}
for(int i=1;i<=2*n;i++)
if(!dfn[i])tarjan(i);
for(int i=1;i<=n;i++)
if(be[i]==be[i+n]){
puts("IMPOSSIBLE");
return 0;
}
puts("POSSIBLE");
for(int i=1;i<=n;i++)
printf("%d ",(be[i]<be[i+n]));
return 0;
}