class DFS
  attr_reader :graph
  def initialize(graph, s)
    @graph   = graph
    @s       = s
    @visited = []
    @edge_to = {}

    dfs(@graph, @s)
  end

  def dfs(graph, s)
    @visited << s

    @graph[s].each do |node|
      next if @visited.include? node
      dfs(graph, node)
      @edge_to[node] = s
    end
  end

  def path_to?(v)
    @visited.include?(v)
  end

  def trace_path(v)
    return false unless path_to?(v)
    path = []

    until v == @s
      v = @edge_to[v]
      path.unshift(v)
    end

    path.unshift(@s)
    path
  end
end
