#include #include #include #include #include #include using namespace std; typedef vector > > Graph; int get_time(Graph& graph, int start) { set grey; grey.insert(start); vector dist(graph.size(), numeric_limits::max()); dist[start] = 0; vector finalised(graph.size(), false); while (!grey.empty()) { int curr_node, curr_dist = numeric_limits::max(); for (set::iterator i = grey.begin(); i != grey.end(); ++i) { if (dist[*i] < curr_dist) { curr_dist = dist[*i]; curr_node = *i; } } grey.erase(curr_node); finalised[curr_node] = true; vector >& edges = graph[curr_node]; for (vector >::iterator i = edges.begin(); i != edges.end(); ++i) { int other_node = i->first; if (!finalised[other_node]) { int other_dist = i->second; if (dist[other_node] > dist[curr_node] + other_dist) { dist[other_node] = dist[curr_node] + other_dist; } grey.insert(other_node); } } } int ret = *max_element(dist.begin(), dist.end()); if (ret == numeric_limits::max()) { return -1; } else { return ret; } } int main() { int num_people; while (cin >> num_people && num_people > 0) { Graph graph; for (int i = 0; i != num_people; ++i) { int num_edges; cin >> num_edges; vector > edges; for (int j = 0; j != num_edges; ++j) { int end, time; cin >> end >> time; --end; edges.push_back(make_pair(end, time)); } graph.push_back(edges); } int min_time = numeric_limits::max(); int min_person; bool disjoint = true; for (int i = 0; i != num_people; ++i) { int time = get_time(graph, i); if (time != -1 && time < min_time) { min_time = time; min_person = i; disjoint = false; } } if (disjoint) { cout << "disjoint" << endl; } else { cout << (min_person + 1) << " " << min_time << endl; } } return 0; }