Как разобрать строку
split() без аргументов
В условии сказано: числа разделены произвольным количеством пробелов и табуляций. Метод split() без аргументов режет строку по любым пробельным символам и сам выбрасывает пустые куски.
split() - всегда без аргументов. Запись split(" ") на двойном пробеле вернёт лишний пустой элемент, и распаковка в три переменные упадёт.
Два целых и одно вещественное
Номера вершин - int, вес - float. Запись int(w) обрежет 5.5 до 5, и ответ уедет.
Где хранить рёбра
Хватит списка троек «откуда, куда, вес». Все алгоритмы дальше работают прямо по этому списку.
edges = [] # список рёбер
for line in f:
a, b, w = line.split()
edges.append((int(a), int(b), float(w)))
Где хранить расстояния
Здесь важна строчка условия: номера вершин не превосходят 1000. Значит, можно завести список из 1001 ячейки и обращаться к нему прямо по номеру вершины - никаких словарей и перенумерации.
graph = [[] for _ in range(1001)]
for a, b, w in edges:
graph[a].append((b, w))
Нельзя предполагать, что вершины идут подряд от 1 до N. В условии вершины могут иметь произвольные номера, поэтому номер вершины - это непосредственно её индекс.