思路应该没问题,调了很久没有过,破防,求调。
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll rd(){
ll x = 0, f = 1; char c = getchar();
while(! isdigit(c)){if(c == '-')f = - f; c = getchar();}
while(isdigit(c)){x = (x << 3) + (x << 1) + (c ^ 48); c = getchar();}
return x * f;
}
const int N = 1e5 + 5;
int n, m, hd[N], cnt;
int low[N], fa[N], dep[N];
int pos[N][2];
bitset < N > vs;
bool o;
struct edge{
int nxt, to;
}e[N << 1];
void add(int u, int v){
e[++cnt] = {hd[u], v}, hd[u] = cnt;
}
void umin(int &x, int y){x = (dep[x] < dep[y] ? x : y);}
void tar(int u, int f){
vs.set(u); low[u] = u; dep[u] = dep[fa[u] = f] + 1;
for(int i = hd[u]; i; i = e[i].nxt){
int v = e[i].to;
if(! vs[v])tar(v, u), umin(low[u], low[v]);
else umin(low[u], v);
}
}
int path[3][N], c[3];
void clr(){
cnt = o = 0;
for(int i = 1; i <= n; ++i)vs.reset(i);
for(int i = 1; i <= n; ++i)
hd[i] = low[i] = 0,
pos[i][0] = pos[i][1] = 0;
for(int i = 0; i < 3; ++i)c[i] = 0;
}
void get(int s, int t, int cur){
int u = pos[s][cur - 1];
c[cur] = dep[u] - dep[s] + 1;
for(int i = c[cur], v = u; i; --i, v = fa[v])path[cur][i] = v;
path[cur][++c[cur]] = u = low[u];
int k = dep[t] - dep[u];
for(int i = 0; i < k; ++i, t = fa[t])path[cur][c[cur] + k - i] = t;
c[cur] += k;
}
void out(){
for(int i = 0; i < 3; ++i, puts("")){
printf("%d", c[i]);
for(int j = 1; j <= c[i]; ++j)printf(" %d", path[i][j]);
}
}
void dfs(int u, int f){
if(o)return; vs.set(u); pos[u][0] = u;
for(int i = hd[u]; i; i = e[i].nxt){
int v = e[i].to; if(vs[v])continue;
dfs(v, u); if(o)return;
if(! pos[u][1]){
pos[u][1] = pos[v][0];
if(dep[low[pos[u][0]]] > dep[low[pos[u][1]]])swap(pos[u][0], pos[u][1]);
}
else if(dep[low[pos[u][0]]] > dep[low[pos[v][0]]])pos[u][1] = pos[u][0], pos[u][0] = pos[v][0];
else if(dep[low[pos[u][1]]] > dep[low[pos[v][0]]])pos[u][1] = pos[v][0];
}
if(dep[low[pos[u][1]]] < dep[u]){
// printf("nb! %d \n", u);
printf("%d %d\n", u, low[pos[u][1]]);
path[0][c[0] = 1] = u;
for(int i = u; i ^ low[pos[u][1]]; i = fa[i], path[0][++c[0]] = i);
get(u, low[pos[u][1]], 1), get(u, low[pos[u][1]], 2);
out();
return o = true, void();
}
}
signed main(){
int T = rd();
while(T--){
n = rd(); m = rd(); clr(); dep[0] = 0;
for(int i = 1, u, v; i <= m; ++i)u = rd(), v = rd(), add(u, v), add(v, u);
for(int i = 1; i <= n; ++i)if(! vs[i])tar(i, 0); dep[0] = N;
for(int i = 1; i <= n; ++i)vs.reset(i);
for(int i = 1; i <= n and o == 0; ++i)if(! vs[i])dfs(i, 0);
if(! o)puts("-1");
}
return 0;
}