#include<bits/stdc++.h>
#define N 2010
using namespace std;
bitset<N>pro[N],fuck[N],now;
int n,m,a[N][N],b[N][N],vis[N],s[N],z,p[N];
struct hh{
	int x,id,now;
}edge[N];
bool operator<(hh a,hh b){
	if(a.x!=b.x)return a.x<b.x;
	return a.now<b.now;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)scanf("%d",&a[i][j]);
	for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)scanf("%d",&b[i][j]);
	for(int i=1;i<n;i++){
		for(int j=1;j<=m;j++){
			if(b[i][j]!=b[i+1][j])pro[j][i]=1;
			if(b[i][j]>b[i+1][j])fuck[j][i]=1;
		}
	}
	while(1){
		int flag=0;
		for(int i=1;i<=m;i++){
			if(vis[i])continue;
			if((now&fuck[i])==fuck[i]){
				flag=1;
				s[++z]=i;
				break;
			}
		}
		if(!flag)break;
		now|=pro[s[z]];
		vis[s[z]]=1;
	}
	for(int i=1;i<=n;i++){
		edge[i].id=edge[i].x=edge[i].now=i;
		p[i]=i;
	}
	for(int i=z;i>=1;i--){
		int x=s[i];
//		cout<<"check "<<i<<' '<<s[i]<<endl;
//		pos=s[i];
//		for(int j=1;j<=n;j++)q[i]=p[i],p[i]=0;
		for(int j=1;j<=n;j++)edge[p[j]].x=a[j][x];
		for(int j=1;j<=n;j++)edge[j].now=j;
		sort(edge+1,edge+1+n);
		for(int j=1;j<=n;j++)p[edge[j].id]=j;
	}
//	for(int i=1;i<=n;i++){
//		for(int j=1;j<=m;j++){
//			printf("%d ",a[edge[i].id][j]);
//		}
//		puts("");
//	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(a[edge[i].id][j]!=b[i][j]){
				cout<<"-1";
				return 0;
			}
		}
	}
	cout<<z<<endl;
	while(z)printf("%d ",s[z--]);
}