I suggest using Lemon, see tutorial: http://lemon.cs.elte.hu/pub/tutorial/a00011.html
Generally speaking you separate structure (the graph) and the data. So in case of lemon you would read each line, split it into 4 fields (delimiter being the whitespace). During the read of the file you should also maintain the hash or map (e.g. std::unordered_map) to quickly lookup destinations already in the graph (or use graph API to find them but that would be slower).
So:
ListDigraph g;
ListDigraph::NodeMap<std::string> gDestinations(g);
ListDigraph::ArcMap<int> gCosts(g);
ListDigraph::ArcMap<int> gDistances(g);
std::unordered_map<std::string, ListDigraph::Node> destinations;
And then for each row:
//first read the line, split it be whitespace into 4 fields, e.g. into these
std::string destFrom, destTo;
int distance, cost;
//first the structure
auto itFrom = destinations.insert(destFrom, g.addNode()).first; //dest is the first or second field in your file
auto itTo = destinations.insert(destTo, g.addNode()).first; //dest is the first or second field in your file
ListDigraph::Arc route = g.addArc(*itFrom, *itTo);
//then the data
gDestinations[*itFrom] = destFrom; //well this could be done once if the place exists already, this s for brevity
gDestinations[*itTo] = destTo; //dtto
gDistances[route] = distance; //distance is the third field
gCosts[route] = cost; //cost is the fourth field
And that is it. See the tutorial and Lemon documentation how to use graph algorithms and manipulate the graph etc.