<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def truncate_graph_dist(G, source_node, max_distance=1000, weight='length', retain_all=False):
 """ Remove everything further than some network distance from a specified node in graph. Parameters G : networkx multidigraph source_node : int the node in the graph from which to measure network distances to other nodes max_distance : int remove every node in the graph greater than this distance from the source_node weight : string how to weight the graph when measuring distance (default 'length' is how many meters long the edge is) retain_all : bool if True, return the entire graph even if it is not connected Returns ------- networkx multidigraph """


    # get the shortest distance between the node and every other node, then
    # remove every node further than max_distance away
    start_time = time.time()
    G = G.copy()
    distances = nx.shortest_path_length(G, source=source_node, weight=weight)
    distant_nodes = {key:value for key, value in dict(distances).items() if value > max_distance}
    G.remove_nodes_from(distant_nodes.keys())
    log('Truncated graph by weighted network distance in {:,.2f} seconds'.format(time.time()-start_time))

    # remove any isolated nodes and retain only the largest component (if
    # retain_all is True)
    if not retain_all:
        G = remove_isolated_nodes(G)
        G = get_largest_component(G)

    return G