#include <stdio.h>
#define MAXIM 1005
int pozitie=MAXIM-1;
char buff[MAXIM];//citesc bucati de cate maxim 10005 caractere
void cit(int &nr){
nr=0;
while(buff[pozitie]<'0' || buff[pozitie]>'9')//cat timp nu e cifra, treci mai departe
if (++pozitie==MAXIM){
fread (buff,1,MAXIM,stdin);
pozitie=0;
}
while('0'<=buff[pozitie] && buff[pozitie]<='9'){//cat timp e cifra
nr=nr*10+buff[pozitie]-'0';
if (++pozitie==MAXIM){
fread (buff,1,MAXIM,stdin);
pozitie=0;
}
}
}
struct nod{
int x1,y1,x2,y2,c;
}portal[5];//sunt 3 portale
struct tri{
int sens1,sens2,sens3;
}triplete[30];//vor fi 27 de triplete
struct p{
int a,b,c;
}permutari[10];//vor fi 6 permutari
void init(){
int i,j,k,t=0;
//init triplete
for(i=-1;i<=1;i++)
for(j=-1;j<=1;j++)
for(k=-1;k<=1;k++){
triplete[t].sens1=i;
triplete[t].sens2=j;
triplete[t].sens3=k;
t++;
}
//init permutari[] cu toate perm multimii {0,1,2}
permutari[0].a=0;
permutari[0].b=1;
permutari[0].c=2;
permutari[1].a=0;
permutari[1].b=2;
permutari[1].c=1;
permutari[2].a=1;
permutari[2].b=0;
permutari[2].c=2;
permutari[3].a=1;
permutari[3].b=2;
permutari[3].c=0;
permutari[4].a=2;
permutari[4].b=0;
permutari[4].c=1;
permutari[5].a=2;
permutari[5].b=1;
permutari[5].c=0;
}
inline int distanta(int a, int b, int x, int y){
//dist de la (a,b) la (x,y)
int dist=0;
if(a<x)dist+=x-a;
else dist+=a-x;
if(b<y)dist+=y-b;
else dist+=b-y;
return dist;
}
int main(){
int t;
int i;
int n,m;
init();
freopen("portal3.in","r",stdin);
FILE *fout=fopen("portal3.out","w");
cit(t);
//scanf("%d",&t);
int j,k;
int a,b,c,pozcx, pozcy;//pozitia curenta
long long dist;
int distmin=0;
int portal0,portal1,portal2;
for(i=0;i<t;i++){
cit(n);
cit(m);
//scanf("%d%d",&n,&m);
for(j=0;j<3;j++){//a j-lea portal
cit(portal[j].x1);
cit(portal[j].y1);
cit(portal[j].x2);
cit(portal[j].y2);
cit(portal[j].c);
//scanf("%d%d%d%d%d",&portal[j].x1,&portal[j].y1,&portal[j].x2,&portal[j].y2,&portal[j].c);
}
distmin=2000000010;
//incep sa rezolv problema
for(j=0;j<27;j++){//iau fiecare triplet
//printf("(%d,%d,%d),",triplete[j].sens1,triplete[j].sens2,triplete[j].sens3);
for(k=0;k<6;k++){//fiecare permutare a sa
portal0=permutari[k].a;
portal1=permutari[k].b;
portal2=permutari[k].c;
a=triplete[j].sens1;
b=triplete[j].sens2;
c=triplete[j].sens3;
//printf("(%d,%d,%d),",permutari[k].a,permutari[k].b,permutari[k].c);
//merg pe jos din (0,0) pana la un portal
pozcx=0;pozcy=0;
dist=0;
//situatia portalului 1
if(a==-1){//a dif de 0, inseamna ca consider portalul 1, luat in sens invers
//merg pe jos pana la gura 2 a primului portal
dist+=distanta(pozcx,pozcy,portal[portal0].x2,portal[portal0].y2)+portal[portal0].c;
pozcx=portal[portal0].x1;
pozcy=portal[portal0].y1;
}else if(a==1){//luat in sensul in care se cere
//merg pe jos pana la gura 1 a primului portal
dist+=distanta(pozcx,pozcy,portal[portal0].x1,portal[portal0].y1)+portal[portal0].c;
pozcx=portal[portal0].x2;
pozcy=portal[portal0].y2;
}
//situatia portalului 2
if(b==-1){//a dif de 0, inseamna ca consider portalul 2, luat in sens invers
//merg pe jos pana la gura 2 a celui de-al doilea portal
dist+=distanta(pozcx,pozcy,portal[portal1].x2,portal[portal1].y2)+portal[portal1].c;
pozcx=portal[portal1].x1;
pozcy=portal[portal1].y1;
}else if(b==1){//luat in sensul in care se cere
//merg pe jos pana la gura 2 a primului portal
dist+=distanta(pozcx,pozcy,portal[portal1].x1,portal[portal1].y1)+portal[portal1].c;
pozcx=portal[portal1].x2;
pozcy=portal[portal1].y2;
}
//situatia portalului 2
if(c==-1){
dist+=distanta(pozcx,pozcy,portal[portal2].x2,portal[portal2].y2)+portal[portal2].c;
pozcx=portal[portal2].x1;
pozcy=portal[portal2].y1;
}else if(c==1){//luat in sensul in care se cere
//merg pe jos pana la gura 1 a primului portal
dist+=distanta(pozcx,pozcy,portal[portal2].x1,portal[portal2].y1)+portal[portal2].c;
pozcx=portal[portal2].x2;
pozcy=portal[portal2].y2;
}
//din pozcx,pozcy merg pe jos pana la n,m
dist+=distanta(pozcx,pozcy,n,m);
if(dist<distmin)distmin=dist;
}
}
fprintf(fout,"%d\n",distmin);
}
return 0;
}