#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define DEBUG 0

struct Point {
	long x,y;
};

double d(struct Point a, struct Point b) {
	long dx,dy;
	double r;
	dx = a.x - b.x;
	dy = a.y - b.y;
	r=sqrt(dx*dx+dy*dy);
	return r;
}

double VectorAngle(struct Point v1, struct Point v2) {
	double ang;
	ang=(atan2(v1.y*v2.x-v1.x*v2.y,v1.x*v2.x+v1.y*v2.y));
	if(ang<0) ang+=2*acos(-1);
	return ang;
}

long nhp,n,m,hp[105];
struct Point ar[105];

void ConvexHull(struct Point *ar, long n) {
	long i, nmax, nmin;
	long max = -2000000000; /* change this to MININT */
	struct Point v1,v2,pr;
	double ang,min;

if(DEBUG) printf("The points are: \n");
if(DEBUG)   for(i=0;i<n;i++) printf("%ld,%ld\n",ar[i].x,ar[i].y);

	nhp=0;
	if(!n) return;
	for(i=0;i<n;i++) if(ar[i].y>max) {
		max=ar[i].y;
		nmax=i;
	}
	hp[0]=nmax;
if(DEBUG)   printf("First point on hull: %ld,%ld \n",ar[hp[0]].x,ar[hp[0]].y);
	if(n==1) {nhp=1; return;};
	pr.x=ar[hp[0]].x-1; pr.y=ar[hp[0]].y;
	
	do {
		min=200.0;
		v1.x=-pr.x+ar[hp[nhp]].x;
		v1.y=-pr.y+ar[hp[nhp]].y;
		for(i=0;i<n;i++) if(i!=hp[nhp])  {
			v2.x=ar[i].x - ar[hp[nhp]].x;
			v2.y=ar[i].y - ar[hp[nhp]].y;
			ang=VectorAngle(v1,v2);
			if(ang<min) { min=ang; nmin=i; }
		}

		pr.x=ar[hp[nhp]].x;
		pr.y=ar[hp[nhp]].y;
		hp[++nhp]=nmin;
      if(DEBUG)printf("Added %ld,%ld to the hull\n",ar[hp[nhp]].x,ar[hp[nhp]].y);
	} while(hp[nhp]!=hp[0]);
}



void main() {
	long i,j;
	double ln;

	freopen("maple.in","r",stdin);
	freopen("maple.out","w",stdout);
	scanf("%ld",&m);
	while(m--) {
		scanf("%ld",&n);
		for(i=0;i<n;i++) scanf("%ld %ld",&ar[i].x,&ar[i].y);
		ConvexHull(ar,n);
		fflush(stderr);
		ln=0.0;
		/* assuming at least two hull points */
		for(i=0;i<nhp-1;i++) {
			ln+=d(ar[hp[i]],ar[hp[i+1]]);
		}
		ln+=d(ar[hp[0]],ar[hp[nhp-1]]);
		printf("%.2lf\n",ln);
	}
}

