#include <iostream>
#include <memory>
#include <vector>
#include <functional>

class Node
{
public:
	Node ( std::string name ) : name__ (name){}

	std::string name__;
	
	bool operator== ( const Node & rhs ) const
	{
		return this->name__ == rhs.name__;
	}
};

struct Edge
{
	std::shared_ptr<Node> from;
	std::shared_ptr<Node> to;
};

int main() 
{
	auto sky_node  = std::make_shared<Node>( "sky" );
    auto is_node   = std::make_shared<Node>( "is" );
    auto blue_node = std::make_shared<Node>( "blue" );
	
	std::vector<Edge> edges = { {sky_node, is_node}, {is_node, blue_node} };
	
	std::function<void ( const std::shared_ptr<Node>, unsigned int )> find_next;
	find_next = [=]( const std::shared_ptr<Node> node_to, unsigned int len )
	{
    	for ( const auto rhs : edges )
    	{  
        	if ( (*node_to) == (*rhs.from) ) 
        	{
            	len++;
            	find_next ( rhs.from, len );
        	}
    	}
	};
	
	for ( const auto lhs : edges )
	{
    	unsigned int len = 0;
    	const auto from = lhs.to;
    	find_next ( from, len );
	}

	return 0;
}