#include<bits/stdc++.h>
using namespace std;
#define int long long
const int MAX=2e6+5;
#define debug(x) printf("debug:%lld\n",x)
#define fo(a,b,c) for(int a=b;a<=c;a++)
#define go(a,b,c) for(int a=b;a>=c;a--)
vector< vector<int> > a;
inline void add(int u,int v)
{
a[u].push_back(v);
}
int n,m,scccnt,col[MAX],low[MAX],dfn[MAX],vis[MAX],cnt;
stack<int> st;
void tarjan(int u)
{
low[u]=dfn[u]=++cnt;
st.push(u);vis[u]=1;
for(auto v:a[u])
{
if(!dfn[v]) tarjan(v);
else if(vis[v]) low[u]=min(low[u],dfn[u]);
}
if(dfn[u]==low[u])
{
++scccnt;
int v;
do
{
v=st.top();
col[v]=scccnt;
st.pop();
vis[v]=0;
}while(u!=v);
// col[u]=scccnt;
}
}
signed main()
{
cin>>n>>m;
a.resize(2*n+1);
fo(i,1,m)
{
int u,v,fu,fv;
cin>>u>>fu>>v>>fv;
switch (fu*2+fv)
{
case 0:
add(u,v+n);
add(v,u+n);
break;
case 1:
add(u,v);
add(v+n,u+n);
/*if(u==v)
{
cout<<"IMPOSSIBLE";return 0;
}*/
break;
case 2:
add(u+n,v+n);
add(v,u);
/*if(u==v)
{
cout<<"IMPOSSIBLE";return 0;
}*/
break;
case 3:
add(u+n,v);
add(v+n,u);
break;
}
}
fo(i,1,2*n)
{
if(!dfn[i]) tarjan(i);
}
fo(i,1,n)
{
if(col[i]==col[i+n])
{cout<<"IMPOSSIBLE";return 0;}
}
cout<<"POSSIBLE"<<endl;
fo(i,1,n)
{
cout<<(col[i]<col[i+n])<<' ';
}
return 0;
}
已经写麻了,明明应该输出impossible却输出了possible