import java.util.*;

class Vertex {

    String name;
    LinkedList<Edge> inList ;
    LinkedList<Edge> outList;

    public Vertex(String s) {
	name = s;
        inList = new LinkedList<Edge>();
        outList = new LinkedList<Edge>();
    }
}

class Edge {
    Vertex vert;

    public Edge(Vertex v) {
        vert = v;
    }
}

public class Graph {
    
    Hashtable<String,Vertex> h;

    public Graph() {
	h = new Hashtable<String, Vertex>();
    }

    public void addVertex(String s) {
        Vertex v = new Vertex(s);
        h.put(s,v);
    }

    public void addEdge(String s1, String s2) {
        Vertex u = h.get(s1);
        Vertex v = h.get(s2);
        if ( (u != null) && (v !=null) ) 
	    {
		u.outList.add(new Edge(v));
                v.inList.add(new Edge(u));
            }
    }

    public void printGraph() {
	Collection<Vertex> vertexList = h.values();

        for(Vertex v: vertexList) {
	    System.out.print(v.name + " :");
	    for(Edge e: v.outList) 
		System.out.print(" " + e.vert.name);
            System.out.println(" ");
	}
    }



    public static void main(String argv []) {
    
	Graph g = new Graph();
        g.addVertex("CS1");
        g.addVertex("DiscStruct");
        g.addVertex("DataStruct");
        g.addEdge("CS1","DiscStruct");
        g.addEdge("DiscStruct","DataStruct");
        g.addEdge("CS1","DataStruct");
        g.printGraph();



    }

}

    