#include<bits/stdc++.h>
#define debug printf("!");
#define mp make_pair
using namespace std;
typedef long long ll;
const int maxn=5e3+50;
const int inf=0x3f3f3f3f;
int n,allstate;
ll a[16][maxn],sum,aver;
unordered_map<ll,pair<int,int>>mpp;
//tsum-tval+val=aver
struct P{
int sta,id;
};
vector<P>vec[16];
bool vis[16][maxn];
bool dfs(int idi,int idj,int&sta,int sti,int stj)//找通过st的回路
{
int num=a[idi][0];
ll tsum=a[idi][num+1],val,tval=a[idi][idj];
val=aver-tsum+tval;
if(!mpp.count(val))return 0;
pair<int,int>pa=mpp[val];
if(vis[pa.first][pa.second])return 0;
//所要访问的点有回路 这条回路不属于自己 并且 无法通过这个点找到新的回路 所以直接return false
if(pa.first==idi&&pa.second!=idj)return 0;
//在题意中 当前点要从box拿出去 然后将pa这个点放进来 可以是拿出去放进来同一个点 或者来自不同box的两个点 但不可能是来自同一box的不同点
if(pa.first==sti&&pa.second==stj)
{
vis[idi][idj]=1;//找到回路 标记点 此后这个点不用再找回路了 因为1个点最多只有一条回路
//因为 一个点所连的点是一个数值 题目原话:All of the integers are distinct.
vec[idi].push_back(P{sta,idj});
return 1;
}
if((1<<pa.first)&sta)return 0;
//这个点所连的点在回路中存在 则这个sta是错的 不是单纯的回路
sta|=(1<<pa.first);
if(dfs(pa.first,pa.second,sta,sti,stj))
{
vis[idi][idj]=1;
vec[idi].push_back(P{sta,idj});
return 1;
}
return 0;
}
int ans[16];//ans[i]=j 把i集合中的j拿出去换
bool can[16][maxn];
bool cann[140000][15];
bool search(int sta)
{
if(!sta)return 1;
for(int i=1;i<=n;i++)
{
if((1<<i)&sta&&!cann[sta][i])
{
for(int j=0;j<vec[i].size();j++)
{
if(can[i][j])continue;
if((sta&vec[i][j].sta)==vec[i][j].sta)
{
if(search(sta-vec[i][j].sta))
{
ans[i]=vec[i][j].id;
return 1;
}
}
if(sta==allstate)can[i][j]=1;
}
}
cann[sta][i]=1;
}
return 0;
}
int tans[16];
void last(int idi,int idj)//根据之前记录的状态记下答案
{
int num=a[idi][0];
ll tsum=a[idi][num+1],val,tval=a[idi][idj];
val=aver-tsum+tval;
pair<int,int> p=mpp[val];
tans[p.first]=idi;
if(ans[p.first]!=inf)return;
ans[p.first]=p.second;
last(p.first,p.second);
}
int main()
{
int i,j,sta;
ll tsum;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
allstate|=1<<i;
scanf("%lld",&a[i][0]);
for(j=1,tsum=0;j<=a[i][0];j++)
{
scanf("%lld",&a[i][j]);
tsum+=a[i][j];
mpp[a[i][j]]=mp(i,j);
}
sum+=tsum;
a[i][j]=tsum;
}
if(sum%n)
{
puts("No");return 0;
}
aver=sum/n;
for(i=1;i<=n;i++)
for(j=1;j<=a[i][0];j++)
if(!vis[i][j])
dfs(i,j,sta=1<<i,i,j);
for(i=1;i<=n;i++)
if(!vec[i].size())
{
puts("No");return 0;
}
memset(ans,inf,sizeof(ans));
if(search(allstate))
{
puts("Yes");
for(i=1;i<=n;i++)
if(ans[i]!=inf)last(i,ans[i]);
for(i=1;i<=n;i++)
printf("%lld %d\n",a[i][ans[i]],tans[i]);
}
else puts("No");
}