#include<bits/stdc++.h>
using namespace std;
const int maxn=2e6+10;
vector <int> mp1[maxn],mp2[maxn];
int p[maxn],tot,fa[maxn],wz[maxn];
bool vis[maxn];
int n,m;
void dfs1(int x)
{
vis[x]=1;
int ss=mp1[x].size();
for(int i=0;i<ss;i++)
{
int sx=mp1[x][i];
if(!vis[sx])
dfs1(sx);
}
p[++tot]=x;
}
void dfs2(int x,int y)
{
vis[x]=0;
fa[x]=y;
if(wz[y]==0) wz[y]=++tot;
int ss=mp2[x].size();
for(int i=0;i<ss;i++)
{
int sx=mp2[x][i];
if(vis[sx])
dfs2(sx,y);
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int x,ix,y,iy;
scanf("%d%d%d%d",&x,&ix,&y,&iy);
mp1[x+!ix*n].push_back(y+iy*n);
mp1[y+!iy*n].push_back(x+ix*n);
mp2[y+iy*n].push_back(x+!ix*n);
mp2[x+ix*n].push_back(y+!iy*n);
}
tot=0;
for(int i=1;i<=n*2;i++)
if(!vis[i])
dfs1(i);
tot=0;
for(int i=n*2;i>=1;i--)
if(vis[p[i]])
dfs2(p[i],p[i]);
bool ok=1;
for(int i=1;i<=n;i++)
if(fa[i]==fa[i+n])
{
ok=0;
break;
}
if(ok==0)
printf("IMPOSSIBLE");
else
{
printf("POSSIBLE\n");
for(int i=1;i<=n;i++)
{
if(wz[fa[i]]<wz[fa[i+n]])
printf("1 ");
else printf("0 ");
}
}
return 0;
}