#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <cstring>
#include <stdio.h>
using namespace std;
struct Student{
char name[5];
};
struct Course{
int id;
int num;
Student* s;
};
bool cmp(const Course& aa,const Course& bb){
return aa.id < bb.id;
}
bool BinarySearch(char query[],const Course& c){
int left = 0;
int right = c.num-1;
int mid,res;
while(left <= right){
mid = (left+right)/2;
res = strcmp(c.s[mid].name,query);
if(res == 0){
return true;
}else if(res > 0){ //比query大
right = mid - 1;
}else{
left = mid + 1;
}
}
return false;
}
int main()
{
int n,k;
scanf("%d %d",&n,&k);
//cin>>n>>k;
Course* c = new Course[k];
int courseID,num;
int i,j,z;
for(i=0;i<k;i++){
scanf("%d %d",&c[i].id,&c[i].num);
//cin>>c[i].id>>c[i].num;
c[i].s = new Student[c[i].num];//有多少个学生在这个分组内
for(j=0;j<c[i].num;j++){
scanf("%s",c[i].s[j].name);
//cin>>c[i].s[j].name;
}
}
sort(c,c+k,cmp);
vector<int> idVec;
char queryName[5];
for(i=0;i<n;i++){
scanf("%s",queryName);
//cin>>queryName;
idVec.clear();
for(j=0;j<k;j++){
if(BinarySearch(queryName,c[j])){
idVec.push_back(j+1);
}
}
int size = idVec.size();
printf("%s %d",queryName,size);
//cout<<queryName<<' '<<size;
for(z=0;z<size-1;z++){
printf(" %d",idVec[z]);
//cout<<' '<<idVec[z];
}
if(size>0){
printf(" %d",idVec[size-1]);
//cout<<' '<<idVec[size-1];
}
printf("\n");
//cout<<endl;
}
return 0;
}
#include <fstream>
#include <algorithm>
#include <vector>
#include <cstring>
#include <stdio.h>
using namespace std;
struct Student{
char name[5];
};
struct Course{
int id;
int num;
Student* s;
};
bool cmp(const Course& aa,const Course& bb){
return aa.id < bb.id;
}
bool BinarySearch(char query[],const Course& c){
int left = 0;
int right = c.num-1;
int mid,res;
while(left <= right){
mid = (left+right)/2;
res = strcmp(c.s[mid].name,query);
if(res == 0){
return true;
}else if(res > 0){ //比query大
right = mid - 1;
}else{
left = mid + 1;
}
}
return false;
}
int main()
{
int n,k;
scanf("%d %d",&n,&k);
//cin>>n>>k;
Course* c = new Course[k];
int courseID,num;
int i,j,z;
for(i=0;i<k;i++){
scanf("%d %d",&c[i].id,&c[i].num);
//cin>>c[i].id>>c[i].num;
c[i].s = new Student[c[i].num];//有多少个学生在这个分组内
for(j=0;j<c[i].num;j++){
scanf("%s",c[i].s[j].name);
//cin>>c[i].s[j].name;
}
}
sort(c,c+k,cmp);
vector<int> idVec;
char queryName[5];
for(i=0;i<n;i++){
scanf("%s",queryName);
//cin>>queryName;
idVec.clear();
for(j=0;j<k;j++){
if(BinarySearch(queryName,c[j])){
idVec.push_back(j+1);
}
}
int size = idVec.size();
printf("%s %d",queryName,size);
//cout<<queryName<<' '<<size;
for(z=0;z<size-1;z++){
printf(" %d",idVec[z]);
//cout<<' '<<idVec[z];
}
if(size>0){
printf(" %d",idVec[size-1]);
//cout<<' '<<idVec[size-1];
}
printf("\n");
//cout<<endl;
}
return 0;
}