#include <algorithm>
#include <functional>
#include <iostream>
#include <iterator>
#include <list>
#include <regex>
#include <sstream>
#include <string>
using namespace std;

typedef char Task;

struct Tache {
	char step;
	int duration;
	list<Task> precedentTask;
};

istream& operator>>(istream& lhs, Tache& rhs) {
	string line;

	getline(lhs, line, '\n');

	stringstream ss(line);

	ss >> rhs.step;
	ss.ignore(numeric_limits<streamsize>::max(), '(');
	ss >> rhs.duration;
	ss.ignore(numeric_limits<streamsize>::max(), ')');

	const regex re("\\s*,\\s*([a-zA-Z])");
	string precedentTasks;

	getline(ss, precedentTasks);

	transform(sregex_token_iterator(cbegin(precedentTasks), cend(precedentTasks), re, 1), sregex_token_iterator(), back_insert_iterator<list<Task>>(rhs.precedentTask), [](const string& i) {
		return i.front();
	});

	return lhs;
}

int main() {
	stringstream seq("A(3)\nB(4),A\nC(2),A\nE(5),A\nG(3),A\nJ(8),B,H\nH(7),C,E,G\nI(6),G\nF(5),H");

	list<Tache> allTaches{ istream_iterator<Tache>(seq), istream_iterator<Tache>() };

	for (const auto& i : allTaches) {
		cout << i.step << ' ' << i.duration << ' ';
		copy(cbegin(i.precedentTask), cend(i.precedentTask), ostream_iterator<Task>(cout, " "));
		cout << endl;
	}
}