#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
#include<queue>
#include<cmath>
#include<cstdlib>
#define LL long long
#define LD long double
using namespace std;
const int NN=100000 +117;
const int MM=1000000 +117;
int read(){
	int fl=1,x;char c;
	for(c=getchar();(c<'0'||c>'9')&&c!='-';c=getchar());
	if(c=='-'){fl=-1;c=getchar();}
	for(x=0;c>='0'&&c<='9';c=getchar())
		x=(x<<3)+(x<<1)+c-'0';
	return x*fl;
}
void open(){
	freopen("a.in","r",stdin);
	//freopen("a.out","w",stdout);
}
void close(){
	fclose(stdin);
	fclose(stdout);
}


int m,n;
struct edge{
	int to,rem,xt;
}e[MM];
int ecnt=1;
int p[2*NN]={};
void ADD(int x,int y,int rem){
	e[++ecnt].to=y;
	e[ecnt].rem=rem;
	e[ecnt].xt=p[x];
	p[x]=ecnt;
}
void add(int x,int y,int rem){
	ADD(x,y,rem);
	ADD(y,x,0);
}
int st,fin;
int g[2*NN]={};
int ht[2*NN]={};
int q[2*NN]={};
bool bfs(int x){
	int std=ht[fin]+10;
	ht[st]=std;
	int hd=0,tl=0;
	q[tl++]=st;
	while(hd!=tl){
		int x=q[hd++];
		if(x==fin)break;
		for(int pos=p[x];pos;pos=e[pos].xt){
			int cur=e[pos].to;
			if(e[pos].rem&&ht[cur]<std){
				ht[cur]=ht[x]+1;
				q[tl++]=cur;
			}
		}
	}
	return ht[fin]>=std;
}
int dfs(int x,int rem){
	if(x==fin)return rem;
	int res=0;
	for(int &pos=g[x];pos;pos=e[pos].xt){
		int cur=e[pos].to;
		if(e[pos].rem&&ht[cur]==ht[x]+1){
			int tp=dfs(cur,min(rem,e[pos].rem));
			if(tp){
				e[pos].rem-=tp;
				e[pos^1].rem+=tp;
				rem-=tp;
				res+=tp;
			}
			if(!rem)break;
		}
	}
	return res;
}
int getf(){
	int res=0;
	while(bfs(st)){
		for(int i=1;i<=fin;++i)g[i]=p[i];
		res+=dfs(st,1e9);
	}
	return res;
}
int match[NN]={};
vector<int> t[NN]={};
int ans[NN][2]={};
int anscnt=0;
bool vis[NN]={};
void getres(int x){
	for(int i=0;i<t[x].size();++i){
		int cur=t[x][i];
		if(!vis[cur]){
			++anscnt;
			vis[cur]=1;
			ans[cur][0]=x;
			ans[cur][1]=match[cur];
			getres(match[cur]);
		}
	}
}
int main(){
	//open();
	n=read();
	st=2*n;
	fin=st+1;
	for(int i=1;i<=n;++i)add(st,i,1);
	for(int i=1;i<n;++i){
		add(n+i,fin,1);
		int k=read();
		for(int j=1;j<=k;++j){
			int x=read();
			t[x].push_back(i);
			add(x,n+i,1);
		}
	}
	int k=getf();
	if(k!=n-1){
		printf("-1\n");
		return 0;
	}
	int rt=0;
	for(int i=1;i<=n;++i){
		bool fl=1;
		for(int pos=p[i];pos;pos=e[pos].xt){
			int cur=e[pos].to;
			if(cur>n&&cur<2*n&&!e[pos].rem){
				match[cur-n]=i;
				fl=0;
			}
		}
		if(fl)rt=i;
	}
	getres(rt);
	if(anscnt!=n-1){
		printf("-1\n");
		return 0;
	}
	for(int i=1;i<=n-1;++i){
		printf("%d %d\n",ans[i][0],ans[i][1]);
	}
	close();
	return 0;
}