#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N = 100010<<1;
const ll M = 100010<<1;
vector<ll> vec[N];
ll n,m;
ll dfn[N],low[N],tot = 0;
bool inst[N];
stack<ll> stk;
ll cnt = 0,bel[N];
void tarjan(ll id,ll fa){
stk.push(id);
dfn[id] = low[id] = ++tot;
inst[id] = true;
for(auto v : vec[id]){
if(dfn[v]){
if(inst[v]) low[id] = min(low[id],dfn[v]);
} else {
tarjan(v,id);
low[id] = min(low[id],low[v]);
}
}
if(low[id]==dfn[id]){
cnt++;
while(stk.top()!=id){
bel[stk.top()] = cnt;
inst[stk.top()] = false;
stk.pop();
}
bel[id] = cnt;
inst[id] = 0;
stk.pop();
}
}
int main(){
scanf("%lld%lld",&n,&m);
for(ll i = 1; i <= m; i++){
ll u,uv,v,vv;
scanf("%lld%lld%lld%lld",&u,&uv,&v,&vv);
if(!uv&&!vv) vec[u+n].push_back(v),vec[v+n].push_back(u);
if(!uv&&vv) vec[u+n].push_back(v+n),vec[v].push_back(u);
if(uv&&!vv) vec[u].push_back(v),vec[v+n].push_back(u+n);
if(!uv&&!vv) vec[u].push_back(v+n),vec[v].push_back(u+n);
}
for(ll i = 1; i <= n<<1; i++) if(!dfn[i]) tarjan(i,i);
for(ll i = 1; i <= n; i++){
if(bel[i]==bel[i+n]){
puts("IMPOSSIBLE");
return 0;
}
}
puts("POSSIBLE");
for(ll i = 1; i <= n; i++) printf("%d ",bel[i]<bel[i+n]);
return 0;
}