#include<stdio.h>
#include<stdlib.h>

struct elemento{
	int info;
	struct elemento * next;
}; 
typedef struct elemento ElementoDiLista; 
typedef ElementoDiLista* ListaDiElementi;

void ListaOrdinata(ListaDiElementi *lista, int elem){ 	
	ListaDiElementi aux;
	aux = malloc(sizeof(ElementoDiLista));
	aux->info = elem;
	if(*lista==NULL){
		aux->next=NULL;
		*lista=aux; //elem va in testa
	}else{
		if((*lista)->info>elem){
			aux->next=*lista;
			*lista=aux; //elem va in coda
		}
		else ListaOrdinata(&((*lista)->next), elem);
	}		
}

ListaDiElementi EliminaDoppi(ListaDiElementi lista3){
	if(lista3==NULL) return NULL;
	ListaDiElementi prec=lista3;
	ListaDiElementi corr=prec->next;
	ListaDiElementi tmp=NULL;
	while(corr!=NULL){
		if(prec->info==corr->info){
			tmp=corr;
			prec->next=corr->next;
			corr=corr->next;
			free(tmp);
		}else{
			prec=corr;
			corr=corr->next;
		}
	}
	return lista3;
}

ListaDiElementi IntersezioneOrdinata(ListaDiElementi lista1, ListaDiElementi lista2){
	ListaDiElementi lista3;
	if ((lista1==NULL)||(lista2==NULL)) return NULL;
	else if (lista1->info < lista2->info){
		return IntersezioneOrdinata(lista1->next,lista2);
	}
	else if (lista1->info > lista2->info){
		return IntersezioneOrdinata(lista1,lista2->next);
    	}else{
		lista3 = malloc(sizeof(ElementoDiLista));
		lista3->info = lista1->info;
		lista3->next = IntersezioneOrdinata(lista1->next,lista2->next);
		return lista3;
    	}
}

void StampaLista(ListaDiElementi lista){
	while(lista!=NULL){
		printf("%d\n",lista->info);
		lista=lista->next;
	}
}

int main(void){
	ListaDiElementi lista1=NULL, lista2=NULL;
	int a=0, b=0;
	while(a>=0){
		scanf("%d", &a);
		if(a>=0) ListaOrdinata(&lista1, a);
	}
	while(b>=0){
		scanf("%d", &b);
		if(b>=0) ListaOrdinata(&lista2, b);
	}
	IntersezioneOrdinata(lista1, lista2);
	EliminaDoppi(IntersezioneOrdinata(lista1, lista2));
	StampaLista(EliminaDoppi(IntersezioneOrdinata(lista1, lista2)));
	return 0;
}
