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 origin;
    Vertex destination;

    public Edge(Vertex o, Vertex d) {
        origin = o;
        destination = d;
    }
}

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) ) 
	    {
                Edge e = new Edge(u,v);
		u.outList.add(e);
                v.inList.add(e);
            }
    }

    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.destination.name);
            System.out.println(" ");
	}
    }



    public static void main(String argv []) {
    
	Graph g = new Graph();
        g.addVertex("CS1");
        g.addVertex("DiscStruct");
        g.addVertex("DataStruct");
        g.addVertex("OO");
        g.addVertex("CO");
        g.addVertex("PL");
        g.addVertex("System");
        g.addVertex("Elective");
        g.addVertex("Algos");
        g.addVertex("Calc");
        g.addEdge("CS1","DiscStruct");
        g.addEdge("DiscStruct","DataStruct");
        g.addEdge("CS1","DataStruct");
        g.addEdge("DiscStruct","OO");
        g.addEdge("OO","PL");
        g.addEdge("DataStruct","PL");
        g.addEdge("DataStruct","CO");
        g.addEdge("CO","System");
        g.addEdge("DataStruct","Elective");
        g.addEdge("DataStruct","Algos");
        g.addEdge("Calc","Algos");
        g.printGraph();



    }

}

    