#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
using namespace std;
const int MAXSIZE = 1000000;
int m;
int n;
int a[MAXSIZE];
int b[MAXSIZE];//我不太知道数组怎么在函数里传递
int next(int k)
{
int i=1;
int j=2;
int n=0;
while(j<k)
{
if(b[i]==b[j])
{
++n;
++i;
++j;
}
else
{
++j;
i=1;
n=0;
}
}
if(k==1){//这个强制定义的也一定要加上,一定不能落条件
return 0;
}else{
return n+1;
}
}
int main()
{
// int next[6]= {-1,0,1,1,0,2};//next和nextal
int fre;
// int m;
// int n;
// char ge;
scanf("%d",&fre);
// scanf("%c",&ge);
for(int i=0; i<fre; ++i)
{
scanf("%d %d",&m,&n);
memset(a, 0, m);
memset(b, 0, n);
// int a[m+1];
// int b[n+1];
for(int j=1; j<=m; ++j)
{
scanf("%d",&a[j]);
}
for(int k=1; k<=n; ++k)
{
scanf("%d",&b[k]);
}
int j=1;
int k=1;
while(j<=m&&k<=n)//这个用while,不用for
{
if(a[j]==b[k])//相等就一次往后加
{
++j;
++k;
}
else//不相等,让k跳到数组哪里,j先不动
{
k=next(k);
// k=next[k];
if(k==0)//如果在模式串第一个字母就不对,那么两个都往后+1,这个时候,k=0,正好+1,变成了1
{
++j;
++k;
}
}
}
// for(int i=1;i<=n;++i){
// printf("%d ",next(b,i));
// }
// printf("\n");
//成功出来之后,k=n+1,并且a[j-1]==b[k-1]
if(k==n+1&&a[j-1]==b[k-1]) //你就要想好,匹配上的条件是什么!
{
printf("%d\n",j-n);//这种最难确定了,一会再改
}
else
{
// printf("%d\n",j);
// printf("%d\n",n);
printf("-1\n");
}
// for(int j=0;j<m;++j){
// for(int k=0;k<n;++k){
// }
// }
// for(int k=0;k<n;++k){
// printf("%d ",b[k]);
// }
}
}