Graph implementation using FIFO lists
Add spaces to improve readability:

head = NULL;
while (tmp)
if (this != &amp;F)


Member functions that do not change any of the class members should be declared with the const specifier:

bool is_empty() const;
bool is_leaf() const;


Some of your while loops could be rewritten as for loops.  For example, the loop in the Node copy constructor could be rewritten as

for (adj* tmp = F.head; tmp != NULL; tmp = tmp-&gt;next)
    push(tmp-&gt;data);


Should a pop with an empty list be tolerated?  Currently you silently ignore the problem by returning a -1.  Would throwing an exception (to report the error) be better?  Or at least a std::assert(false); before the return, so you can detect the problem in a debug build.  Also, you don't need the else there, since the body of the if will return.

You have no error checking.  In particular, add_edge will happily try to add an edge to a node that doesn't exist, resulting in Undefined Behavior and (if you're lucky) a crash.  (The same applies to Graph::operator[].  You could add an assert check, or an at method that would check the bounds, similar to how std::vector operates.)

Your Graph copy constructor does not copy nodes[0].

Why are you using raw memory for Graph's nodes?  You should use std::vector or some form of smart pointer.