public string AlienOrder(string[] words)
        {
            int len = 0;

            for (int i = 0; i < words.Length; i++)
            {
                len = Math.Max(len, words[i].Length);
            }


            var g = new Graph();

            for (int i = 0; i < words.Length; i++)
            {
                for (int l = 0; l < words[i].Length; l++)
                {
                    g.AddNode(words[i][l]);
                }
            }

            var skip = new bool[words.Length];

            for (int l = 0; l < len; l++)
            {
                for (int i = 0; i < words.Length - 1; i++)
                {
                    if (skip[i + 1])
                    {
                        continue;
                    }
                    if (l >= words[i].Length)
                    {
                        continue;
                    }
                    if (words[i][l] == words[i + 1][l])
                    {
                        continue;
                    }
                    try
                    {
                        g.InsertEdgeOrdered(words[i][l], words[i + 1][l]);
                    }
                    catch
                    {
                        return(string.Empty);
                    }
                    skip[i + 1] = true;
                }
            }

            return(TopologicalSorter.SortToString(g));
        }