RT
#include <bits/stdc++.h>
using uui = unsigned int;
using lli = long long;
using uli = unsigned long long;
using ddf = double;
using ldf = long double;
int main() {
std::ios::sync_with_stdio(0);
std::cin.tie(nullptr);
int n, m; std::cin >> n >> m;
std::vector<std::vector<int>> gph(n+3);
for(int i = 0; i < m; ++i) {
int a, b, s, t;
std::cin >> a >> b >> s >> t;
if(s == t) continue;
gph[a].emplace_back(b);
gph[b].emplace_back(a);
}
for(int i = 1; i <= n; ++i) {
if(gph[i].size() & 1) {
std::cout << "NIE";
return 0;
}
}
std::stack<int> stk; std::vector<bool> sig(n+3, 0);
std::vector<std::vector<int>> ans;
std::map<std::pair<int, int>, bool> vis;
auto dfs = [&](auto &f, int x) -> void {
auto tmp = gph[x];
// std::cout << "x: " << x << '\n';
for(auto i: tmp) {
if(vis[{x, i}]) continue;
vis[{x, i}] = vis[{i, x}] = 1;
// std::cout << "i: " << i << '\n' ;
f(f, i);
}
if(sig[x]) {
// std::cout << "haha x: " << x << '\n';
std::vector<int> vec;
vec.emplace_back(x);
for(; stk.top() != x; stk.pop()) {
sig[stk.top()] = 0;
vec.emplace_back(stk.top());
}
stk.pop();
sig[x] = 0;
vec.emplace_back(x); ans.push_back(vec);
// for(auto i: vec) std::cout << i << '\n';
// std::cout << '\n';
}
stk.push(x), sig[x] = 1;
};
for(int i = 1; i <= n; ++i) {
dfs(dfs, i);
}
std::cout << ans.size() << '\n';
for(auto i: ans) {
std::cout << i.size() - 1 << ' ';
for(auto j: i) std::cout << j << ' ';
std::cout << '\n';
}
}