fork download
  1.  
  2. #include <bits/stdc++.h>
  3.  
  4. using namespace std;
  5.  
  6. using ll = long long;
  7. const int MOD = 1000000007;
  8. const int MOD2 = 998244353;
  9. const ll INF = 1e18;
  10. const int MX = 1000001; //check the limits, dummy
  11.  
  12.  
  13. ll modExp(ll base, ll power) {
  14. if (power == 0) {
  15. return 1;
  16. } else {
  17. ll cur = modExp(base, power / 2); cur = cur * cur; cur = cur % MOD;
  18. if (power % 2 == 1) cur = cur * base;
  19. cur = cur % MOD;
  20. return cur;
  21. }
  22. }
  23.  
  24. ll inv(ll base) {
  25. return modExp(base, MOD-2);
  26. }
  27.  
  28.  
  29. ll mul(ll A, ll B) {
  30. return (A*B)%MOD;
  31. }
  32.  
  33. ll add(ll A, ll B) {
  34. return (A+B)%MOD;
  35. }
  36.  
  37. ll dvd(ll A, ll B) {
  38. return mul(A, inv(B));
  39. }
  40.  
  41. ll sub(ll A, ll B) {
  42. return (A-B+MOD)%MOD;
  43. }
  44.  
  45. ll* facs = new ll[MX];
  46. ll* facInvs = new ll[MX];
  47.  
  48. ll choose(ll a, ll b) {
  49. if (b > a) return 0;
  50. if (a < 0) return 0;
  51. if (b < 0) return 0;
  52. ll cur = facs[a];
  53. cur = mul(cur, facInvs[b]);
  54. cur = mul(cur, facInvs[a-b]);
  55. return cur;
  56. }
  57.  
  58. void initFacs() {
  59. facs[0] = 1;
  60. facInvs[0] = 1;
  61. for (int i = 1 ; i < MX ; i ++ ) {
  62. facs[i] = (facs[i-1] * i) % MOD;
  63. facInvs[i] = inv(facs[i]);
  64. }
  65. }
  66. int low[100005];
  67. int tin[100005];
  68. bool isBridge[100005];
  69. vector<pair<int,int>> adj[100005];
  70. pair<int,int> edges[300005];
  71. int c = 1;
  72. void dfs(int a, int p) {
  73. tin[a] = c;
  74. low[a] = c;
  75. c ++;
  76. for (auto child : adj[a]) {
  77. if (child.first == p) continue;
  78. if (tin[child.first] == 0) {
  79. dfs(child.first, a);
  80. low[a] = min(low[a],low[child.first]);
  81. if (low[child.first] > tin[a]) {
  82. isBridge[child.second] = true;
  83. }
  84. } else {
  85. low[a] = min(low[a], tin[child.first]);
  86. }
  87. edges[child.second] = {a,child.first};
  88. }
  89. }
  90.  
  91. int main() {
  92. ios_base::sync_with_stdio(0); cin.tie(0);
  93. int n , m ; cin >> n >> m ;
  94. for (int i = 0 ; i < m ; i ++) {
  95. int a,b ; cin >> a >> b;
  96. adj[a].push_back({b,i});
  97. adj[b].push_back({a,i});
  98. edges[i] = {a,b};
  99. }
  100. for (int i = 1 ; i <= n; i ++) {
  101. low[i] = INT_MAX;
  102. }
  103. dfs(1 ,0);
  104.  
  105. for (int i = 0 ; i < n; i ++) {
  106. if (isBridge[i]) {
  107. cout << 0 << endl;
  108. return 0;
  109. }
  110. }
  111. for (int i = 0 ; i < n; i ++) {
  112. cout << edges[0].first << ' ' << edges[0].second << endl;
  113. }
  114.  
  115. return 0;
  116. }
  117.  
  118.  
  119.  
Success #stdin #stdout 0.01s 6100KB
stdin
6 8
1 2
2 3
1 3
4 5
4 6
5 6
2 4
3 5
stdout
1 2
1 2
1 2
1 2
1 2
1 2