RT
#include<bits/stdc++.h>
using namespace std;
const int MAXN=100005;
int n,m;
vector<int>g[MAXN];
int fa[MAXN];
int getfa(int x){
if(fa[x]!=x)return fa[x]=getfa(fa[x]);
return x;
}
void Merge(int x,int y){
x=getfa(x),y=getfa(y);
fa[y]=x;
}
int K;
int du[MAXN];
map<pair<int,int>,bool>killed;
int t[MAXN];
int ans[MAXN],ansn;
void dfs(int x){
int glen=g[x].size();
while(t[x]<glen){
int v=g[x][t[x]++];
if(killed[make_pair(x,v)])continue;
killed[make_pair(x,v)]=killed[make_pair(v,x)]=1;
dfs(v);
}
ans[++ansn]=x;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
fa[i]=i;
for(int i=0;i<m;++i){
int t1,t2,t3,t4;
scanf("%d%d%d%d",&t1,&t2,&t3,&t4);
if(t3!=t4){
++du[t1],++du[t2];
g[t1].push_back(t2);
g[t2].push_back(t1);
Merge(t1,t2);
}
}
for(int i=1;i<=n;++i){
if(!du[i])
return puts("NIE"),0;
if(du[i]%2)
return puts("NIE"),0;
fa[i]=getfa(i);
if(fa[i]==i)++K;
}
printf("%d\n",K);
for(int i=1;i<=n;++i){
if(fa[i]==i){
ansn=0;
dfs(i);
printf("%d ",ansn-1);
for(int j=ansn;j;--j){
printf("%d ",ans[j]);
}
printf("\n");
}
}
return 0;
}