快要自闭了,SPJ 说我的路径不是简单环,但是我加了一堆 assert 还是检查不出来
/*10:24*/
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define db double
#define ldb long double
#define pb push_back
#define mp make_pair
#define pii pair<int, int>
#define FR first
#define SE second
using namespace std;
inline int read() {
int x = 0; bool op = 0;
char c = getchar();
while(!isdigit(c))op |= (c == '-'), c = getchar();
while(isdigit(c))x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();
return op ? -x : x;
}
const int N = 1e6 + 10;
int n, m, top, cnt;
int deg[N], stk[N], r[N], tg[N], hd[N], p[N], cr[N];
int vis[N];
vector<pii> G[N];
vector<vector<int> > ans;
void dfs(int u) {
tg[u] = true;
for(int i = hd[u]; i < G[u].size(); i = hd[u]) {
pii e = G[u][i]; hd[u] = i + 1;
if(cr[e.FR])continue; cr[e.FR] = true;
dfs(e.SE);
}
p[++cnt] = u;
return ;
}
void solve(int st) {
cnt = 0; top = 0; dfs(st);
for(int i = cnt; i; i--) {
stk[++top] = p[i];
if(r[p[i]]) {
vector<int> v;
int st = r[p[i]];
for(int j = st; j <= top; j++) {
v.pb(stk[j]); r[stk[j]] = 0;
}
ans.pb(v); top = st;
}
r[p[i]] = top;
}
return ;
}
map<pii, int> f;
int main() {
freopen("4.in", "r", stdin);
freopen("out.txt", "w", stdout);
n = read(); m = read();
for(int i = 1; i <= m; i++) {
int u = read(), v = read(), s = read(), t = read();
if(s ^ t) {
G[u].pb(mp(i, v)); G[v].pb(mp(i, u));
deg[u]++; deg[v]++;
f[mp(u, v)] = f[mp(v, u)] = true;
}
}
for(int i = 1; i <= n; i++)if(deg[i] & 1)return puts("NIE"), 0;
for(int i = 1; i <= n; i++)if(tg[i] == false)solve(i);
printf("%d\n", ans.size());
for(auto v : ans) {
printf("%d ", v.size());
for(int x : v)printf("%d ", x); putchar('\n');
for(int i = 0; i + 1 < v.size(); i++) {
assert(f[mp(v[i], v[i + 1])] == true);
assert(vis[v[i]] == false); vis[v[i]] = true;
}
assert(v.front() == v.back());
for(int x : v)vis[x] = false;
// for(int x : v)assert(vis[x] == false), vis[x] = true;
}
return 0;
}