#include<bits/stdc++.h>
using namespace std;
struct node{
int num[21];
};
int n, m;
node a[21];
int ans[21];
void dfs(int x, int start, int sum, vector<node> t){
if(t.size() <= 0){
ans[x] = min(ans[x], sum);
if(start == 1 && n != 1){
ans[x] = 1;
}
return;
}
vector<node> temp;
for(int i = start; i <= m; i++){
temp.clear();
for(int j = 0; j < t.size(); j++){
if(a[x].num[i] == t[j].num[i]){
temp.push_back(t[j]);
}
}
dfs(x, i + 1, sum + 1, temp);
}
return;
}
int main(){
memset(ans, 0x3f, sizeof(ans));
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++){
scanf("%d", &a[i].num[j]);
}
}
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
if(i == j){
continue;
}
bool t = false;
for(int k = 1; k <= m; k++){
if(t){
break;
}
if(a[i].num[k] != a[j].num[k]){
t = true;
break;
}
}
if(!t){
ans[i] = -1;
}
}
}
vector<node> t;
for(int i = 1; i <= n; i++){
if(ans[i] == -1){
continue;
}
t.clear();
for(int j = 1; j <= n; j++){
if(i == j || ans[j] == -1){
continue;
}
t.push_back(a[j]);
}
dfs(i, 1, 0, t);
}
for(int i = 1; i <= n; i++){
printf("%d ", ans[i]);
}
return 0;
}