#include<bits/stdc++.h>
using namespace std;
#define int long long
#define y1 Y1
const int N=23333;
int spmp[N+1][3];//特殊能量值每回合增益
int spatk[N+1][3];//特殊攻击力每回合增益
int spdef[N+1][3];//特殊防御力每回合增益
int respmp[N+1][3];
int respatk[N+1][3];
int respdef[N+1][3];
int n,Round,endtime[2];
struct chara{
int hp,mp,atk,def,nowhp,nowmp;//见题意
int delatk,deldef;//攻击增益,防御增益
int prio[19];//优先级
int tf,x1,y1;//天赋,参数
int jn,x2,y2,z2;//技能,参数
bool from,isdied;//阵营,0=Alice,1=Bob,是否死亡
int nowfight;//现在打第几个人
}name[19][2];//name[i][0]=Alice,else=Bob
int numA(chara id){//题中的A
return max(1ll,id.atk+id.delatk);
}
int numD(chara id){//题中的D
return max(0ll,id.def+id.deldef);
}
bool theend(int p){
for(int i=1;i<=n;i++) if(!name[i][p].isdied) return 0;
return 1;
}
int checkend(){//有没有结束
if(theend(0)) return 0;
if(theend(1)) return 1;
return -1;
}
void print(){
cout<<Round<<'\n';
int loser=checkend();
if(loser==1) cout<<"Alice\n";
else cout<<"Bob\n";
loser=1-loser;
for(int j=1;j<=n;j++) cout<<(name[j][loser].isdied?0:name[j][loser].nowhp)<<' ';
}
void newprio(chara &id){//更新攻击目标
for(int i=1;i<=n;i++){
if(!name[id.prio[i]][1-id.from].isdied){
id.nowfight=i;
return;
}
}
print();
}
void checkdie(chara &id){//吃伤害后死不死
if(id.nowhp<=0) id.isdied=1,id.nowhp=0;
}
int realhurt(chara &id,int x,int y){//算伤害
if(id.tf==1) y-=y/2;
return max(x-numD(id),0ll)+y;
}
void gethurt(chara &id,int x,int y){//吃伤害
id.nowmp=min(id.nowmp+1,id.mp);
id.nowhp-=realhurt(id,x,y);
checkdie(id);
if(checkend()!=-1){
print();
exit(0);
}
}
void usejn(chara &id){//用技能
for(int i=1;i<=n;i++) if(!name[i][id.from].isdied) newprio(name[i][id.from]);
int fro=id.from,to=1-id.from;
int jn=id.jn,x1=id.x1,y1=id.y1;
if(jn==0) return;//技能:心态崩了!
else if(jn==1){//技能:格林炸裂!
for(int i=1;i<=n;i++) if(!name[i][to].isdied) gethurt(name[i][to],id.x2,0),name[i][to].nowmp=max(name[i][to].nowmp-name[i][to].nowmp/10,0ll);
}
else if(jn==2){//技能:日昇之雨!
for(int i=1;i<=n;i++) if(!name[i][to].isdied) gethurt(name[i][to],0,numA(id));
}
else if(jn==3){//技能:天楼霸断剑!
for(int i=1;i<=n;i++) if(!name[i][to].isdied) gethurt(name[i][to],min(name[i][to].hp/10,id.x2*numA(id)),0);
}
else if(jn==4){//技能:演出开始!
for(int i=Round;i<=min(Round+id.x2-1,N);i++) spmp[i][fro]+=id.y2;
}
else if(jn==5){//技能:天狼噬斩!
name[id.prio[id.nowfight]][to].deldef-=id.x2;
gethurt(name[id.prio[id.nowfight]][to],0,numA(id));
}
else if(jn==6){//技能:地球蓝色闪电!
gethurt(name[id.prio[id.nowfight]][to],0,numA(id));
for(int i=Round;i<=min(Round+id.x2-1,N);i++) spatk[i][to]-=id.y2;
}
else if(jn==7){//技能:极光绽放!
int mx=1e15,mxid=0;
for(int i=1;i<=n;i++) if(mx>name[i][fro].nowhp&&!name[i][fro].isdied) mx=name[i][fro].nowhp,mxid=i;
name[mxid][fro].nowhp=min(name[mxid][fro].hp,name[mxid][fro].nowhp+id.z2);
for(int i=Round;i<=min(Round+id.x2-1,N);i++) spatk[i][fro]+=id.y2;
}
else if(jn==8){//技能:流星!
for(int i=1;i<=n;i++) gethurt(name[i][to],numA(id),0);
for(int i=Round;i<=min(Round+id.x2-1,N);i++) spdef[i][to]-=id.y2;
}
else if(jn==9){//技能:精灵庇护!
for(int i=1;i<=n;i++) if(!name[i][fro].isdied) name[i][fro].nowhp=min(name[i][fro].hp,name[i][fro].nowhp+id.z2);
for(int i=Round;i<=min(Round+id.x2-1,N);i++) spdef[i][fro]+=id.y2;
}
else{//技能:全力超全开!轮回之终末!
for(int i=1;i<=n;i++) for(int k=0;k<=1;k++) if(name[i][k].jn==10) name[i][k].jn=0;
endtime[id.from]=Round+id.x2-1;
for(int i=1;i<=n;i++){
if(name[i][fro].isdied) continue;
name[i][fro].atk*=2,name[i][fro].def*=2;
name[i][fro].nowhp=max(name[i][fro].hp/2,name[i][fro].nowhp);
name[i][fro].nowmp=max(name[i][fro].mp/2,name[i][fro].nowmp);
}
for(int i=Round;i<=min(Round+id.x2-1,N);i++) spmp[i][fro]++;
}
for(int i=1;i<=n;i++) if(!name[i][id.from].isdied) newprio(name[i][id.from]);
return;
}
void init(int p){
for(int i=1;i<=n;i++){
name[i][p].from=p,name[i][p].nowfight=1;
cin>>name[i][p].hp>>name[i][p].mp>>name[i][p].atk>>name[i][p].def;
name[i][p].nowhp=name[i][p].hp;
for(int j=1;j<=n;j++) cin>>name[i][p].prio[j];
cin>>name[i][p].tf>>name[i][p].x1>>name[i][p].y1;
cin>>name[i][p].jn>>name[i][p].x2>>name[i][p].y2>>name[i][p].z2;
}
}
int normalhurt(chara &id){//平A伤害
if(id.tf==4) return realhurt(name[id.prio[id.nowfight]][1-id.from],0,numA(id));
if(id.tf==2) return realhurt(name[id.prio[id.nowfight]][1-id.from],numA(id),id.x1);
return realhurt(name[id.prio[id.nowfight]][1-id.from],numA(id),0);
}
void gethurt3(chara &id,int num){
id.nowmp=min(id.nowmp+1,id.mp);
id.nowhp-=num;
checkdie(id);
}
void gethurt2(chara &id){//吃伤害
if(id.tf==4) gethurt3(name[id.prio[id.nowfight]][1-id.from],realhurt(name[id.prio[id.nowfight]][1-id.from],0,numA(id)));
else if(id.tf==2) gethurt3(name[id.prio[id.nowfight]][1-id.from],realhurt(name[id.prio[id.nowfight]][1-id.from],id.x1,numA(id)));
else gethurt3(name[id.prio[id.nowfight]][1-id.from],realhurt(name[id.prio[id.nowfight]][1-id.from],numA(id),0));
if(checkend()!=-1){
print();
exit(0);
}
}
void work(int p){
for(int i=1;i<=n;i++)
if(!name[i][p].isdied)
newprio(name[i][p]);
int attack=0;
name[0][p].jn=-1;
for(int i=n;i>=1;i--){
if(name[i][p].nowmp==name[i][p].mp&&!name[i][p].isdied){
if(name[i][p].jn>name[attack][p].jn) attack=i;
}
}
if(attack){
name[attack][p].nowmp=0;
usejn(name[attack][p]);
name[attack][p].nowmp=min(name[attack][p].nowmp+1,name[attack][p].mp);
if(name[attack][p].tf==5) name[attack][p].nowmp=min(name[attack][p].nowmp+name[attack][p].y1,name[attack][p].mp);
for(int i=1;i<=n;i++){
for(int k=0;k<=1;k++){
if(!name[i][k].isdied){
name[i][k].delatk-=respatk[Round][k];
name[i][k].deldef-=respdef[Round][k];
}
}
}
for(int k=0;k<=1;k++) respatk[Round][k]=spatk[Round][k],respdef[Round][k]=spdef[Round][k];
for(int i=1;i<=n;i++){
for(int k=0;k<=1;k++){
if(!name[i][k].isdied){
name[i][k].delatk+=spatk[Round][k];
name[i][k].deldef+=spdef[Round][k];
}
}
}
}
if(!attack){
int att=n;
for(int i=n-1;i>=1;i--){
if(name[i][p].isdied) continue;
if(name[name[i][p].prio[name[i][p].nowfight]][1-p].nowhp>name[name[att][p].prio[name[att][p].nowfight]][1-p].nowhp) att=i;
if(name[name[i][p].prio[name[i][p].nowfight]][1-p].nowhp==name[name[att][p].prio[name[att][p].nowfight]][1-p].nowhp){
int num1=normalhurt(name[i][p]),num2=normalhurt(name[att][p]);
if(num1>num2) att=i;
}
}
gethurt2(name[att][p]);
name[att][p].nowmp=min(name[att][p].nowmp+1,name[att][p].mp);
if(name[att][p].tf==5) name[att][p].nowhp=min(name[att][p].nowhp+name[att][p].x1,name[att][p].hp);
}
for(int i=1;i<=n;i++){
if(!name[i][p].isdied){
name[i][p].nowmp=min(name[i][p].mp,name[i][p].nowmp+1);
if(name[i][p].tf==3){
name[i][p].nowhp=min(name[i][p].nowhp+name[i][p].x1,name[i][p].hp);
name[i][p].nowmp=min(name[i][p].nowmp+name[i][p].y1,name[i][p].mp);
}
name[i][p].nowmp=min(name[i][p].nowmp+spmp[Round][p],name[i][p].mp);
}
}
}
void solve(){
for(int k=0;k<=1;k++) respatk[Round][k]=spatk[Round][k],respdef[Round][k]=spdef[Round][k];
for(int i=1;i<=n;i++)
for(int k=0;k<=1;k++)
if(!name[i][k].isdied)
name[i][k].delatk+=respatk[Round][k],name[i][k].deldef+=respdef[Round][k];
work(0);
work(1);
for(int i=1;i<=n;i++){
for(int k=0;k<=1;k++){
if(!name[i][k].isdied){
name[i][k].delatk-=respatk[Round][k];
name[i][k].deldef-=respdef[Round][k];
}
}
}
if(Round==endtime[0]){
for(int i=1;i<=n;i++) name[i][0].isdied=1;
return;
}
if(Round==endtime[1]){
for(int i=1;i<=n;i++) name[i][1].isdied=1;
return;
}
}
signed main(){
// freopen("P7610_1.in","r",stdin);
cin>>n;
init(0);
init(1);
while(Round<=N){
Round++;
solve();
if(checkend()!=-1){
print();
return 0;
}
}
cout<<"^w^";
return 0;
}