#include<bits/stdc++.h>
using namespace std;
#define up(i,l,r) for(int i=l;i<=r;++i)
#define dn(i,l,r) for(int i=l;i>=r;--i)
const int N=2e6+5;
vector<int> e[N];
int scc[N],cnt=0,idx=0,dfn[N],low[N],sta[N],top=0,n,m;
bool in[N];
inline void dfs(int u){
in[u]=1;dfn[u]=low[u]=++idx;sta[++top]=u;
for(auto it:e[u]){
if(!dfn[it]){
dfs(it);low[u]=min(low[u],low[it]);
}else if(in[it]){
low[u]=min(low[u],dfn[it]);
}
}
if(dfn[u]==low[u]){
++cnt;
while(sta[top]!=u){
scc[sta[top]]=cnt;
in[sta[top]]=0;
--top;
}
scc[u]=cnt;in[u]=0;--top;
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cin>>n>>m;
up(i,1,m){
int u,a,v,b;
cin>>u>>a>>v>>b;
e[u+a*n].push_back(v+(b^1)*n);
e[u+(a^1)*n].push_back(v+b*n);
}
up(i,1,n<<1) if(!dfn[i]) dfs(i);
up(i,1,n<<1){
if(i<=n&&scc[i]==scc[i+n]){
cout<<"IMPOSSIBLE";return 0;
}
}
cout<<"POSSIBLE\n";
up(i,1,n){
cout<<(scc[i]>scc[i+n])<<' ';
}
return 0;
}