func_code_string: #include <bits/stdc++.h>   using namespace std;   struct edge {     edge(int to, int back, int orient = 0) : to(to), back(back), orient(orient) {}     int to;     int back;     int orient;   };   class Tarjan {    public:     vector<vector<int> > adj;     vector<int> comp;     int nb_cfc;       private:     vector<int> index;     vector<int> lowlink;     stack<int> s;     int id;     void tarjan(int i) {       int j, k;       index[i] = id;       lowlink[i] = id;       ++id;       s.push(i);       for (k = 0; k < (int)adj[i].size(); ++k) {         j = adj[i][k];         if (index[j] == -1) tarjan(j);         if (comp[j] == -1) lowlink[i] = min(lowlink[i], lowlink[j]);       }       if (lowlink[i] == index[i]) {         do {           j = s.top();           s.pop();           comp[j] = nb_cfc;         } while (i != j);         ++nb_cfc;       }     }       public:     void cfc() {       id = 0;       nb_cfc = 0;       comp.clear();       index.clear();       lowlink.clear();       comp.resize(adj.size(), -1);       index.resize(adj.size(), -1);       lowlink.resize(adj.size(), -1);       for (int i = 0; i < (int)adj.size(); ++i) {         if (index[i] == -1) tarjan(i);       }     }   };   void dfs(vector<vector<edge> > &graph, vector<bool> &mark, int x) {     if (mark[x]) return;     mark[x] = true;     for (int i = 0; i < (graph[x].size()); ++i) {       int y = graph[x][i].to;       if (graph[x][i].orient == 0) {         int j = graph[x][i].back;         graph[x][i].orient = 1;         graph[y][j].orient = -1;         dfs(graph, mark, y);       }     }   }   int main(void) {     int n, m;     cin >> n >> m;     vector<vector<edge> > graph(n);     for (int i = 0; i < (m); ++i) {       int x, y;       cin >> x >> y;       --x, --y;       int u = graph[x].size();       int v = graph[y].size();       graph[x].push_back(edge(y, v));       graph[y].push_back(edge(x, u));     }     vector<bool> mark(n, false);     dfs(graph, mark, 0);     Tarjan g;     g.adj.assign(n, vector<int>());     for (int x = 0; x < (n); ++x)       for (int i = 0; i < (graph[x].size()); ++i) {         int y = graph[x][i].to;         if (graph[x][i].orient > 0) g.adj[x].push_back(y);       }     g.cfc();     if (g.nb_cfc > 1)       cout << 0 << endl;     else {       for (int i = 0; i < (n); ++i)         for (int j = 0; j < (graph[i].size()); ++j) {           int x = i, y = graph[i][j].to;           if (y < x) continue;           if (graph[i][j].orient < 0) swap(x, y);           ++x, ++y;           cout << x <<     << y << endl;         }     }     return 0;   }   