#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
int n,m;
int num[4];
vector<vector<int>> hun;
vector<int> minn(vector<int> &A,int id)//返回A中最小的数
{
vector<int>C;
// for(auto a:A)
// cout<<a<<endl;
//cout<<A[1]<<endl;
for(int j=1;j<=n;j++)//每种扑克牌张数
for(int i=1;i<=m;i++)//扑克牌种类
if(A[i]>=j)
{
A[i]-=j;
int t=j;
while(t--)
C.push_back(i);
num[id]-=j;
// cout<<i<<endl;
return C;
}
return C;
}
vector<int> mnn(vector<int>&A,vector<int> &B,int id)//求一个大于A的数,若没有则返回一个长度为0 的vector。
{
vector<int>C;
int cnt=A.size(),n=A.front();
for(int i=1+n;i<=m;i++)
if(B[i]>=cnt)
{
C.insert(C.end(),cnt,i);
B[i]-=cnt;
num[id]-=cnt;
return C;
}
for(int i=1;i<=n;i++)
if(B[i]>cnt)
{
B[i]-=(cnt+1);
C.insert(C.end(),cnt+1,i);
num[id]-=(cnt+1);
return C;
}
return C;
}
int main()
{
cin>>n>>m;
hun.resize(4,vector<int>(m+2,0));
for(int i=0;i<3;i++)num[i]=n;
for(int i=0;i<3;i++)
for(int j=0;j<n;j++)
{
int x;
cin>>x;
hun[i][x]++;
}
// for(int j=0;j<3;j++)
// { for(int k=1;k<=3;k++)
// cout<<hun[j][k]<<" ";
// cout<<endl;
// }
auto last=minn(hun[0],0);
int choice=0;
int cnt=0;
for(int i=1;;i++)
{
// for(auto l:last)
// cout<<l<<" ";
// cout<<endl;
int id=i%3;
if(choice==2)
{
choice=0;
last=minn(hun[id],id);
continue;
}
// cout<<choice<<endl;
//cout<<choice<<endl;
auto A=mnn(last,hun[id],id);
if(A.size()==0)
{
choice++;
// cout<<id+1<<"出不起"<<endl;
}
if(A.size()){
last=A;
// cout<<id+1<<"出的起"<<endl;
choice=0;
}
// for(int j=0;j<3;j++)
// { for(int k=1;k<=3;k++)
// cout<<hun[j][k]<<" ";
// cout<<endl;
// }
if(num[id]==0)
{
cout<<id+1<<endl;
break;
}
}
return 0;
}