#include <iostream>
#include <string> 
#include <vector>

using namespace std;

class Node
{
public:
	Node(int value): _value(value) {};
	
	Node(Node* parent, int value): _value(value)
	{
		if (parent != nullptr)	
		{
			parent->_children.push_back(this);
		}
	};
	
	void Serialize() 
	{
		Serialize(this);
	}
	
	
private:
	int _value;
	vector<Node*> _children;
	
	string GetValueAsString()
	{ 
		return std::to_string(_value);
	}

	void Serialize(Node* node) 
	{
    	if (node == nullptr) return;
    	cout << "<Node value=\"" << node->GetValueAsString() << "\">";
    	if (node->_children.size() > 0)
    	{
    		cout << "<Children>";
    		for(auto* child: node->_children) 
    		{
    	    	Serialize(child);
    		}
    		cout << "</Children>";
    	}
    	cout << "</Node>";
	}
};

int main() {
	// your code goes here
	Node root = Node(1);
	root.Serialize();
	
	cout << endl << "------" << endl;
	
	Node leaf1 = Node(&root, 123);
	Node leaf2 = Node(&root, 12345);
	Node leaf3 = Node(&root, 45);

	root.Serialize();
	cout << endl << "------" << endl;
	
	Node leaf1_1 = Node(&leaf1, 2);
	Node leaf1_2 = Node(&leaf1, 42);
	
	Node leaf3_1 = Node(&leaf3, 69);
	Node leaf1_1_1 = Node(&leaf1_1, 3);
	root.Serialize();
}