#include<bits/stdc++.h>
using namespace std;
#define MAX_V 1000

int N;
vector<int> G[MAX_V];
int match[MAX_V];
bool used[MAX_V];

bool dfs(int v){
  used[v]=true;
  for(int i=0;i<(int)G[v].size();i++){
    int u=G[v][i],w=match[u];
    if( w<0 || (!used[w]&&dfs(w)) ){
      match[u]=v;
      match[v]=u;
      return true;
    }
  }
  return false;
}
 
int bipartite_matching(){
  int res=0;
  memset(match,-1,sizeof(match));
  for(int v=0;v<N;v++){
    if(match[v]<0){
      memset(used,false,sizeof(used));
      if(dfs(v))res++;
    }
  }
  return res;
}
 
int main(){
  scanf("%d",&N);
  N--;
  for(int i=0;i<N;i++){
    for(int j=0;j<N;j++){
      int a;
      scanf("%d",&a);
      if(a==1)G[j].push_back(N+i);
    }
  }

  for(int i=0;i<N;i++)sort(G[i].begin(),G[i].end());
  int f=bipartite_matching();
  if(f!=N){
    printf("no\n");
  }else{
    printf("yes\n");
    for(int i=0;i<N;i++){
      match[ match[i] ]=-1;
      match[i]=-1;
      memset(used,false,sizeof(used));
      dfs(i);
      G[i].clear();
      G[i].push_back( match[i] );
    }
    
    for(int i=0;i<N;i++)
      printf("%d\n",match[i]-N+1);
    
  }
  return 0;
}