#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 1e5;
const int MAX_LOG_N = 16;
int n;
int sef[MAX_N + 1], parent[MAX_LOG_N + 1][MAX_N + 1];
vector<int> vert[MAX_N];
int depth[MAX_N + 1];
int sp[MAX_N + 1];
vector<int> adj[MAX_N];
vector<pair<int, int>> edges;
int findSef(int v) {
    if (sef[v] != v)
        sef[v] = findSef(sef[v]);
    return sef[v];
}
void reroot(int u, int p) {
    parent[0][u] = p;
    depth[u] = depth[p] + 1;
    for (int v: adj[u]) {
        if (v == p)
            continue;
        reroot(v, u);
    }
}
bool connect(int u, int v) {
    int x = findSef(u);
    int y = findSef(v);
    if (x == y)
        return true;
    if (vert[x].size() < vert[y].size())
        swap(x, y);
    reroot(v, u);
    for (int l = 1; (1 << l) <= n; l++) {
        for (int v: vert[y])
            parent[l][v] = parent[l - 1][parent[l - 1][v]];
    }
    for (int a: vert[y])
        vert[x].push_back(a);
    vert[y].clear();
    sef[y] = x;
    adj[u].push_back(v);
    adj[v].push_back(u);
    return false;
}
int lca(int u, int v) {
    if (depth[u] > depth[v]) 
        swap(u, v);
    for (int l = log2(n); l >= 0; l--) {
        if (depth[v] - (1 << l) >= depth[u]) 
            v = parent[l][v];
    }
    if (u == v)
        return u;
    for (int l = log2(n); l >= 0; l--) {
        if (parent[l][u] != parent[l][v]) {
            u = parent[l][u];
            v = parent[l][v];
        }
    }
    return parent[0][u];
}
void dfs(int u, int p) {
    // printf("%d %d\n", u, p);
    for (int v: adj[u]) {
        if (v == p)
            continue;
        dfs(v, u);
        sp[u] += sp[v];
    }
    if (p != 0 && sp[u] == 0)
        cout << u << " " << p << "\n";
}
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    int m;
    cin >> n >> m;
    for (int v = 1; v <= n; v++)
        sef[v] = v;
    for (int e = 0; e < m; e++) {
        int u, v;
        cin >> u >> v;
        // printf("%d %d %d\n", u, v, connect(u, v));
        if (connect(u, v))
            edges.push_back({u, v});
    }
    for (auto x: edges) {
        int u = x.first, v = x.second;
        int l = lca(u, v);
        sp[u]++;
        sp[v]++;
        sp[l] -= 2;
    }
    for (int v = 1; v <= n; v++) {
        int p = parent[0][v];
        if (p == 0)
            dfs(v, 0);
    }
    return 0;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |