// Задача "Великий Флатландскитй Забор"
// 4-я личная Интернет-олимпиада сезона 2009/2010
// Автор задачи: Федор Царев, fedor.tsarev@gmail.com
// Автор решения: Владимир Ульянцев, ulyantsev@rain.ifmo.ru

// Неверное сравнение отрезков

uses
    math;
type
    int = longint;
const
    MAXN = 1000;
    MAXX = 1000000000;
var
    n, i, cnt : int;
    x1, y1, x2, y2 : array [1..3 * MAXN] of int;
    _x1, _x2, _x3, _y1, _y2, _y3 : int;
    ans : extended;

function cmpPoints(x1, y1, x2, y2 : int) : boolean;
begin
    result := (x1 = x2) and (y1 = y2);
end;

procedure addSegment(_x1, _y1, _x2, _y2 : int);
var
    j : int;
begin
    for j := 1 to cnt do begin
        if (cmpPoints(x1[j], y1[j], _x1, _y1) and cmpPoints(x2[j], y2[j], _x2, _y2)) then begin
           ans := ans - hypot((_x1 - _x2), (_y1 - _y2));
           exit;
        end;
    end;

    cnt := cnt + 1;
    ans := ans + hypot((_x1 - _x2), (_y1 - _y2));
    x1[cnt] := _x1;
    y1[cnt] := _y1;
    x2[cnt] := _x2;
    y2[cnt] := _y2;
end;

begin
    reset(input, 'greatwall.in');
    rewrite(output, 'greatwall.out');

    read(n);
    assert((1 <= n) and (n <= MAXN));

    cnt := 0;
    ans := 0;
    for i := 1 to n do begin
        read(_x1, _y1, _x2, _y2, _x3, _y3);

        assert((-MAXX <= _x1) and (_x1 <= MAXX));
        assert((-MAXX <= _x2) and (_x2 <= MAXX));
        assert((-MAXX <= _x3) and (_x3 <= MAXX));
        assert((-MAXX <= _y1) and (_y1 <= MAXX));
        assert((-MAXX <= _y2) and (_y2 <= MAXX));
        assert((-MAXX <= _y3) and (_y3 <= MAXX));

        addSegment(_x1, _y1, _x2, _y2);
        addSegment(_x1, _y1, _x3, _y3);
        addSegment(_x3, _y3, _x2, _y2);
    end;

    writeln(ans:0:4);
end.
