#include <list>
#include <memory>
#include <utility>
#include <vector>

    template <
        typename Vertex, 
        typename Edge,
        template <typename, typename> class Container = std::vector,
        typename Allocator = std::allocator<void*>
    >
    class GraphNode
    {
    public:
        typedef GraphNode<Vertex, Edge, Container, Allocator> NodeType;
        typedef std::pair< Edge, NodeType* > LinkType;
        typedef typename Allocator::template rebind<LinkType>::other AllocatorType;
        typedef Container<LinkType, AllocatorType> NeighboursType;
    
        Vertex vertex;
        NeighboursType neighbours;
    };

    int main() {
      GraphNode<long, int> gn0;
      GraphNode<long, int, std::list> gn1;
      GraphNode<long, int, std::vector> gn2;
    }