#include<bits/stdc++.h>
#define fd(i,j) i+n*j
using namespace std;
int n,m,tot,cnt;
int a[2000010],head[2][2000010],z[2000010],f[2000010],fz[2000010];
bool vis[2000010];
struct EDGE
{
int v,nxt;
}g[2][2000010];
void add(int u,int v)
{
g[0][tot].v=v;
g[0][tot].nxt=head[0][u];
head[0][u]=tot;
g[1][tot].v=u;
g[1][tot].nxt=head[1][v];
head[1][v]=tot++;
}
void intl()
{
tot=0;
cnt=0;
memset(head,-1,sizeof(head));
}
void dfs1(int x)
{
vis[x]=1;
for(int i=head[0][x],v;~i;i=g[0][i].nxt)
if(!vis[v=g[0][i].v]) dfs1(v);
z[++cnt]=x;
fz[x]=cnt;
}
void dfs2(int x,int y)
{
f[x]=y;
vis[x]=0;
for(int i=head[1][x],v;~i;i=g[1][i].nxt)
if(vis[v=g[1][i].v]) dfs2(v,y);
}
void jud()
{
for(int i=1;i<=n;i++)
if(f[fd(i,0)]==f[fd(i,1)])
{
printf("IMPOSSIBLE\n");
return;
}
printf("POSSIBLE\n");
for(int i=1;i<=n;i++)
{
if(fz[fd(i,0)]<fz[fd(i,1)]) printf("1 ");
else printf("0 ");
}
return;
}
int main()
{
intl();
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int x,y,q,p;
scanf("%d%d%d%d",&x,&p,&y,&q);
int fp=p^1,fq=q^1;
add(fd(x,fp),fd(y,q));
add(fd(y,fq),fd(y,p));
}
for(int i=1;i<=2*n;i++)
if(!vis[i]) dfs1(i);
for(int i=2*n;i>=1;i--)
if(vis[z[i]]) dfs2(z[i],z[i]);
jud();
return 0;
}
只过了第三个点QWQ