C# Solution with dfs
\n public IList<IList<int>> CriticalConnections(int n, IList<IList<int>> connections) {\n        var dic = new Dictionary<int, List<int>>();\n            foreac
```\n public IList<IList<int>> CriticalConnections(int n, IList<IList<int>> connections) {\n        var dic = new Dictionary<int, List<int>>();\n            foreach (var connection in connections)\n            {\n                if (dic.ContainsKey(connection[0]))\n                    dic[connection[0]].Add(connection[1]);\n                else dic.Add(connection[0], new List<int> { connection[1] });\n                if (dic.ContainsKey(connection[1]))\n                    dic[connection[1]].Add(connection[0]);\n                else dic.Add(connection[1], new List<int> { connection[0] });\n            }\n\n            int[] rank = new int[dic.Count];\n            for (int i = 0; i < rank.Length; i++)\n                rank[i] = -2;\n\n            var conns = new Dictionary<(int, int), int>();\n            int dfs(int node, int depth)\n            {\n                if (rank[node] >= 0)\n                    return rank[node];\n\n                rank[node] = depth;\n                int min = n;\n                foreach (var neighbor in dic[node])\n                {\n                    if (rank[neighbor] == depth - 1)\n                        continue;\n                    int back_depth = dfs(neighbor, depth + 1);\n                    if (back_depth <= depth)\n                        conns.Add((node, neighbor), 1);\n                    min = Math.Min(min, back_depth);\n                }\n\n                return min;\n            }\n            dfs(0, 0);\n\n            var res = new List<IList<int>>();\n            foreach (var conn in connections)\n                if (!conns.ContainsKey((conn[0], conn[1])) && !conns.ContainsKey((conn[1], conn[0])))\n                    res.Add(conn);\n\n            return res;\n    }\n```
['Depth-First Search']