#include<iostream>#include<cstdio>#include<cstring>#include<utility>#include<algorithm>#include<vector>#include<cmath>usingnamespace std;#defineeps1e-8#defineN_MAX105#defineINF1e6int n;typedef pair<double,double> pdd;
pdd sol[N_MAX];structPoint{double x,y;Point(double x =0,double y =0):x(x),y(y){}booloperator<(const Point& pi){return x < pi.x;}
Point operator+(const Point& pi){returnPoint(x + pi.x,y + pi.y);}
Point operator-(const Point& pi){returnPoint(x - pi.x,y - pi.y);}
Point operator*(double t){returnPoint(x * t,y * t);}};typedef Point Vector;structTr{
Point p[3];}tr[N_MAX];intsign(double x){if(fabs(x)< eps)return0;if(x >0)return1;return-1;}intdcmp(double x,double y){if(fabs(x - y)< eps)return0;if(x > y)return1;return-1;}doublecross(Vector a,Vector b){return a.x * b.y - b.x * a.y;}doubledot(Vector a,Vector b){return a.x * b.x + a.y * b.y;}boolon_segment(Point p,Point a,Point b){returnsign(dot(p - a,p - b))<=0;}
Point get_line_intersection(Point p,Vector v,Point q,Vector w){if(!sign(cross(v,w)))returnPoint(INF,INF);
Vector u = p - q;double t =cross(w,u)/cross(v,w);
Point o = p + v * t;if(!on_segment(o,p,p + v)||!on_segment(o,q,q + w))returnPoint(INF,INF);return o;}doubleline_area(double a,int side){int cnt =0;for(int i =1; i <= n; i ++){if(dcmp(tr[i].p[0].x, a)>0||dcmp(tr[i].p[2].x, a)<0)continue;if(!dcmp(tr[i].p[0].x, a)&&!dcmp(tr[i].p[1].x, a)){if(!side)sol[++cnt]={tr[i].p[0].y, tr[i].p[1].y};}if(!dcmp(tr[i].p[1].x, a)&&!dcmp(tr[i].p[2].x, a)){if(side)sol[++cnt]={tr[i].p[1].y, tr[i].p[2].y};}else{double d[3];int u =0;for(int j =0; j <3; j ++){
Point o =get_line_intersection(tr[i].p[j], tr[i].p[(j +1)%3]- tr[i].p[j],Point(a,-INF),Point(0,2* INF));if(dcmp(o.x, INF))d[u ++]= o.y;}if(u){sort(d, d + u);
sol[++ cnt]={d[0],d[u -1]};}}}if(!cnt)return0;double res =0;for(int i =1; i <= cnt; i ++){if(sol[i].first > sol[i].second)swap(sol[i].first, sol[i].second);}sort(sol +1, sol + cnt +1);double st = sol[1].first,ed = sol[1].second;for(int i =2; i <= cnt; i ++){if(sol[i].first <= ed)ed =max(ed, sol[i].second);else{
res += ed - st;
st = sol[i].first;
ed = sol[i].second;}}
res += ed - st;return res;}doublerange_area(double a,double b){return(line_area(a,0)+line_area(b,1))*(b - a)/2;}intmain(int argc,char*argv[]){scanf("%d",&n);
vector<double>v;for(int i =1; i <= n; i ++){for(int j =0; j <3; j ++){scanf("%lf %lf",&tr[i].p[j].x,&tr[i].p[j].y);
v.push_back(tr[i].p[j].x);}sort(tr[i].p,tr[i].p +3);}for(int i =1; i <= n; i ++){for(int j = i +1; j <= n; j ++){for(int x =0; x <3; x ++){for(int y =0; y <3; y ++){
Point o =get_line_intersection(tr[i].p[x], tr[i].p[(x +1)%3]- tr[i].p[x],
tr[j].p[y], tr[j].p[(y +1)%3]- tr[j].p[y]);if(dcmp(o.x, INF))v.push_back(o.x);}}}}sort(v.begin(),v.end());double res =0;for(int i =1; i < v.size(); i ++){if(v[i -1]!= v[i])res +=range_area(v[i -1], v[i]);}printf("%.2lf\n", res);return0;}