public GraphElement[] getMinimalSpanningTree() {
        GraphLine[] tree = new GraphLine[this.points.size() - 1];
        HashMap<Integer, GraphPoint> gps = new HashMap();
        HashMap<Integer, GraphLine> gls = new HashMap(this.lines);
        int k = 0;
        gps.put(points.keySet().iterator().next(), points.get(points.keySet().iterator().next()));
        dbg("put: " + gps.size());
        while ( k < points.size() - 1) {
            // ищем минимальной длины ребро, соединенное хотя бы с одной вершиной
            int min = Integer.MAX_VALUE;
            int minid = -1;
            Iterator<Map.Entry<Integer, GraphLine>> itdist = gls.entrySet().iterator();
            while (itdist.hasNext()) {
                Map.Entry<Integer, GraphLine> buf1 = itdist.next();
                if (buf1.getValue().getWeight() <= min && 
                        (gps.get(buf1.getValue().getFirst().getId()) != null ||
                        gps.get(buf1.getValue().getSecond().getId()) != null)) {
                    min = buf1.getValue().getWeight();
                    minid = buf1.getKey();
                }
            }
            dbg("!minid = " + minid);
            if (minid == -1) {
                return null;
            }
            // проверяем его на создание циклов
            GraphLine gl = gls.get(minid);
            if (gps.get(gl.getFirst().getId()) != null && gps.get(gl.getSecond().getId()) != null) {
                gls.remove(minid);
                continue;
            }
            tree[k] = gl;
            gps.put(gl.getFirst().getId(), gl.getFirst());
            gps.put(gl.getSecond().getId(), gl.getSecond());
            gls.remove(minid);
            dbg("Add " + k + " * " + gl.getId());
            k++;
        }
        return tree;
        
    }