public static Graph GenerateGraph(int vertexes, int edges, int weightFrom, int weightTo)
        {
            var result = GenerateTree(vertexes);

            var alredyGeneratedEdges = new MyHashSet(vertexes);
            foreach (var edge in result.Edges) {
                alredyGeneratedEdges.Add(Tuple.Create(edge.From, edge.To));
            }

            while (result.Edges.Count != edges) {
                var from = random.Next(vertexes);
                var to = random.Next(vertexes);

                if (from == to) continue;

                if (alredyGeneratedEdges.Contains(Tuple.Create(from, to))) {
                    var newPair = NeedNewPair(alredyGeneratedEdges, Tuple.Create(from, to), vertexes);
                    from = newPair.Item1;
                    to = newPair.Item2;
                }

                alredyGeneratedEdges.Add(Tuple.Create(from, to));

                result.Edges.Add(new Edge<int>(from, to, 0));
            }

            foreach (var edge in result.Edges) {
                edge.Weight = random.Next(weightFrom, weightTo + 1);
            }

            return result;
        }
        private static Tuple<int, int> NeedNewPair(MyHashSet alredyGeneratedEdges, Tuple<int, int> value, int vertexes)
        {
            var from = value.Item1;
            var to = value.Item2;

            for (var i = from; i < vertexes; i++) {
                for (var j = to; j < vertexes; j++) {
                    var tuple = Tuple.Create(i, j);
                    if (!alredyGeneratedEdges.Contains(tuple)) {
                        return tuple;
                    }
                }
            }

            for (var i = from; i >= 0; i--) {
                for (var j = to; j >= 0; j--) {
                    var tuple = Tuple.Create(i, j);
                    if (!alredyGeneratedEdges.Contains(tuple)) {
                        return tuple;
                    }
                }
            }

            throw new Exception("Check edges count");
        }