Как вы сказали, это простая DFS. Каждый раз, когда вы приходите на узел, который вы посещали ранее, происходит цикл. Просто удалите последний край.
Псевдокод без определенного языка.
void walk(current_node, previous_node)
if visited[current_node]
remove edge between current_node and previous_node
return
end
visited[current_node] = true
for (each adjacent node)
walk(adjacent_node, current_node)
end
end