#include<bits/stdc++.h>
using namespace std;
inline int read()
{
int s=0,w=1;
char c=getchar();
while(c<'0'||c>'9')
{
if(c=='-')w=-1;
c=getchar();
}
while(c>='0'&&c<='9')s=(s<<3)+(s<<1)+(c^48),c=getchar();
return s*w;
}
inline void print(int x)
{
if(x<0)x=-x,putchar('-');
if(x>=10)print(x/10);
putchar(x%10+48);
}
int n,m;
struct node{
int v,next,flg;
}e[1000010];
int eid=0,head[1000010],in[1000010],vis[1000010],visit[1000010],vv[1000010],num;
inline void insert(int u,int v)
{
e[eid].v=v;
e[eid].next=head[u];
head[u]=eid++;
}
stack<int> st;
inline void dfs(int u)
{
for(int i=head[u];~i;i=head[u])
{
head[u]=e[i].next;
int v=e[i].v;
if(e[i].flg)continue;
e[i].flg=e[i^1].flg=1;
dfs(v);
}
st.push(u);
}
inline void Dfs(int u,int col)
{
visit[u]=col;
for(int i=head[u];~i;i=e[i].next)
{
int v=e[i].v;
if(vv[i]||vv[i^1])continue;
vv[i]=1;
num++;
if(!visit[v])
Dfs(v,col);
}
}
int ans=0;
vector<int> G[100010];
int main()
{
memset(head,-1,sizeof(head));
n=read();
m=read();
int s=1;
for(int i=1;i<=m;i++)
{
int u=read(),v=read(),s=read(),t=read();
int w=s^t;
if(w==1)
{
insert(u,v);
insert(v,u);
in[u]++;
in[v]++;
}
}
int tot=0;
for(int S=1;S<=n;S++)
{
if(visit[S])continue;
num=0;
Dfs(S,++tot);
//puts("");
int cnt=0;
s=0;
for(int i=1;i<=n;i++)
{
if(visit[i]==tot)
{
if(!s)
s=i;
}
}
for(int i=1;i<=n;i++)
{
if((in[i]&1)&&visit[i]==tot)
{
if(!s)s=i;
cnt++;
}
}
//cout<<s<<"\n";
if(cnt!=0&&cnt!=2)
{
puts("NIE");
return 0;
}
dfs(s);
//cout<<"num:"<<num<<"\n";
if(st.size()!=num+1)
{
puts("NIE");
return 0;
}
ans++;
while(st.size())
{
int u=st.top();
st.pop();
G[ans].push_back(u);
if(vis[u])
{
for(int i=0;i<G[ans].size();i++)
{
vis[G[ans][i]]=0;
}
ans++;
G[ans].push_back(u);
}
vis[u]=1;
}
if((int)G[ans].size()==1)G[ans].pop_back(),ans--;
}
print(ans);
puts("");
for(int i=1;i<=ans;i++)
{
if(G[i].size()==1)
{
while(1)
{
puts("DeaphetS");
}
}
print((int)G[i].size()-1);
putchar(' ');
for(int u:G[i])
{
print(u);
putchar(' ');
}
puts("");
}
}
先不管复杂度的问题了。