using System.Collections.Generic;
public static void Main()
var words = new string []{"baa", "abcd", "abca", "cab", "cad"};
for(int i=0;i<words.Length -1; i++){
int loopEnd = words[i].Length < words[i+1].Length ? words[i].Length : words[i+1].Length;
for(int j=0;j<loopEnd;j++){
if(words[i][j] != words[i+1][j]){
graph.AddEdge(words[i][j]-'a',words[i+1][j]-'a' );
public List<int>[] Vertices{get;set;}
private int _verticeCount;
public int VerticeCount{get{return _verticeCount;}}
public Graph(int vertices){
_verticeCount = vertices;
Vertices= new List<int>[VerticeCount];
public void AddEdge(int u, int v){
if(u<0 || v<0 || u>=VerticeCount || v>=VerticeCount){
Vertices[u] = new List<int>();
public void TopologicalSort(int vertex, bool[] visited, Stack<int> result){
if(Vertices[vertex] !=null){
foreach(int edge in Vertices[vertex]){
TopologicalSort(edge,visited,result);
public void TopologicalSort(){
bool[] visited=new bool[VerticeCount];
Stack<int> result = new Stack<int>();
for(int i=0;i<VerticeCount; i++){
TopologicalSort(i,visited,result);
Console.Write("=>{0}", (char)(result.Pop() + 'a'));