I need to create a kevin bacon game by implementing a graph class, but I'm having a lot of trouble starting. Here is what I have and I'm not sure if it is even correct.

Java Code:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;


public class Graph<T, L> {

	private HashMap<T,Node<T,L>> nodes;

    public Graph() {

	nodes = new HashMap<T,Node<T,L>>();

    }

    /** 
     * Look for an existing node with label @lab and return it.
     * Return null if no such node exists.
     */
    public Node<T,L> findNode(T lab) {

	if (nodes.containsKey(lab))
		return nodes;

/**
 * The Node component of a graph, consisting of a label with generic type T,
 * and {@link outArcs} to edges which have labels of generic type L.
 */
import java.util.List;
import java.util.ArrayList;

public class Node<T, L> {
    private T label;
    private ArrayList<Edge<T,L>> outArcs;

    public Node(T l) { label = l; outArcs = new ArrayList<Edge<T,L>>(); }

    /** 
     * Getters and Setters
     */
    public T getLabel() { return label; }
    public void setLabel(T l) { label = l; }
    public List<Edge<T,L>> getOutArcs() {
	return outArcs;
    }
    public void addOutArc(Edge<T,L> e) {
	outArcs.add(e);
    }


    /** 
     * Returns a string of the form:
     * Node(foo)
     * where "foo" is generated by the label's toString() method
     */
    public String toString() {
	return "Node("+label.toString()+")";
    }

    /** 
     * Returns a string of the form:
     * Node(foo)
     *   --Edge(53)->Node(bar)
     *   --Edge(31)->Node(jaz)
     *   --Edge(98)->Node(zip)
     * where each outbound edge from the current node is represented, 
     * and the destination node X is printed via X's toString() method
     * (not X's toStringWithEdges() method)
     */
    public String toStringWithEdges() { 
	StringBuilder sb = new StringBuilder(toString()+"\n");
	for (Edge<T,L> e : outArcs) {
	    sb.append("  --"+e.toString()+"-->"+e.getHead().toString()+"\n");
	}
	return sb.toString();
    }
}
public class Edge<T, L> {
    private L label;
    private Node<T,L> head;
    private Node<T,L> tail;

    public Edge(L l, Node<T,L> h, Node<T,L> t) {
	label = l; head = h; tail = t;
    }

    /** 
     * Getters and Setters
     */
    public L getLabel() { return label; }
    public void setLabel(L l) { label = l; }
    public Node<T,L> getTail() { return tail;}
    public Node<T,L> getHead() { return head;}

    /** 
     * Returns a string of the form:
     * Edge(foo)
     * where "foo" is generated by the label's toString() method
     */
    public String toString() {
	return "Edge("+label.toString()+")";
    }
}
I'm supposed to implement my graph by keeping track of the nodes as a HashMap from labels to Nodes. Please help and if you any good websites on how to implement this type of graph, it would be much appreciated. Thanks.