#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,q,se[N],fa[N],co[N],m,cnt=1,ans,vis[N];
vector<int>e[N];
set<int>E[N];
map<int,int>id[N],ie[N];
int gf(int x){
return fa[x]==x?fa[x]:fa[x]=gf(fa[x]);
}
void bfs(int x,int y){
queue<int>q0,q1;
int s0=0,s1=0;
vector<int>t0,t1;
q0.push(x),q1.push(y);
while(!q0.empty()&&!q1.empty()){
x=q0.front(),y=q1.front();
if(s0+E[x].size()<s1+E[y].size()){
q0.pop(),t0.push_back(x);
s0+=E[x].size();
for(auto v:E[x])if(vis[v]!=cnt)q0.push(v),vis[v]=cnt;
}else{
q1.pop(),t1.push_back(y);
s1+=E[y].size();
for(auto v:E[y])if(vis[v]!=cnt)q1.push(v),vis[v]=cnt;
}
}
if(q0.empty())for(auto v:t0)co[v]=cnt;
else for(auto v:t1)co[v]=cnt;
}
int main(){
scanf("%d%d",&n,&q);
for(int i=1;i<=n;++i){
scanf("%d",&se[i]);
co[i]=1;
for(int j=0,x;j<se[i];++j){
scanf("%d",&x);
e[i].push_back(x);
E[i].insert(x);
id[i][x]=j;
}
}
for(int i=1;i<=n;++i){
for(auto v:e[i])if(!ie[i][v]){
ie[i][v]=++m;
for(int x=v,y=i;;swap(x,y)){
int z=(id[x][y]+1)%se[x];
y=e[x][z];
ie[x][y]=m;
if(x==i)break;
}
}
}
for(int i=1;i<=m;++i)fa[i]=i;
for(int i=1,x,y;i<=q;++i){
char op=getchar();
while(op!='-'&&op!='?')op=getchar();
scanf("%d%d",&x,&y);
x^=ans,y^=ans;
if(op=='?'){
ans=(co[x]==co[y]);
printf("%d\n",ans);
}else{
int u=gf(ie[x][y]),v=gf(ie[y][x]);
E[x].erase(y),E[y].erase(x);
if(u!=v){
fa[u]=v;
ans=cnt;
}else{
ans=++cnt;
bfs(x,y);
}
printf("%d\n",ans);
}
}
return 0;
}