#include #include #include #include using namespace std; int n,m,q; vector stars[1001]; int L; vector Graph[151]; int dist[151]; bool TFO[151]; bool edge[151][151]; int tL; pair tail[151]; int main() { freopen("movie.in","r",stdin); freopen("movie.out","w",stdout); int i,j,in; int q; int actor; int x,y; int uk; int v,d; int themin; memset(stars,false,sizeof(stars)); memset(edge,false,sizeof(edge)); scanf("%d %d",&n,&m); for (i=1;i<=m;i++) { scanf("%d",&L); for (j=1;j<=L;j++) { scanf("%d",&actor); stars[actor].push_back(i); } } for (i=1;i<=n;i++) { for (j=0;j<(int)stars[i].size();j++) { for (in=j+1;in<(int)stars[i].size();in++) { if (edge[ stars[i][j] ][ stars[i][in] ]) continue; edge[ stars[i][j] ][ stars[i][in] ]=true; edge[ stars[i][in] ][ stars[i][j] ]=true; Graph[ stars[i][j] ].push_back( stars[i][in] ); Graph[ stars[i][in] ].push_back( stars[i][j] ); } } } scanf("%d",&q); for (i=1;i<=q;i++) { scanf("%d %d",&x,&y); if (x==y) { printf("0\n"); continue; } memset(dist,-1,sizeof(dist)); memset(TFO,false,sizeof(TFO)); tL=0; for (j=0;j<(int)stars[y].size();j++) { tL++; tail[tL]=make_pair( stars[y][j],1 ); TFO[ stars[y][j] ]=true; } uk=1; while(uk<=tL) { v=tail[uk].first; d=tail[uk].second; dist[v]=d; for (j=0;j<(int)Graph[v].size();j++) { if (!TFO[ Graph[v][j] ]) { TFO[ Graph[v][j] ]=true; tL++; tail[tL]=make_pair( Graph[v][j],d+1 ); } } uk++; } themin=-1; for (j=0;j<(int)stars[x].size();j++) { if (themin==-1 || themin>dist[ stars[x][j] ]) { themin=dist[ stars[x][j] ]; } } printf("%d\n",themin); } return 0; }