Напиши функцию, которая без использования сторонних библиотек и встроенных функций для работы с графами, определяет кратчайший путь между двумя вершинами в неориентированном взвешенном графе, представленном в виде словаря, где ключ - вершина, а значение - список кортежей, где первый элемент - соседняя вершина, а второй - вес ребра, при этом граф может содержать циклы и отрицательные веса, но не должен содержать отрицательных циклов, и если пути не существует, функция должна вернуть None, а если существует, то список вершин, составляющих кратчайший путь, и его общую длину, с учетом того, что алгоритм должен иметь сложность не хуже O(E * logV), где E - количество ребер, а V - количество вершин.