
#include <iostream> // includes cin to read from stdin and cout to write to stdout
#include <map>
#include <set>
#include <list>
#include <string>
#include <fstream>
#include <algorithm>
#include <vector>
#include <cassert>
#include <cassert>
#include <math.h>
#include <iomanip>
#include <limits>

///LLONG_MAX,INT_MA
#define FOR(i,a,b) for(int i=(a),_b=(b);i<=_b;i++)
#define REP(i,n) FOR(i,0,(n)-1)
#define FORD(i,a,b) for(int i=(a),_b=(b);i>=_b;i--)
#define sz size()
#define FORA(i,c) REP(i,size(c))

#define itype(c) __typeof((c).begin())
#define FORE(e,c) for(itype(c) e=(c).begin();e!=(c).end();e++)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define SORT(x) sort(all(x))
#define REVERSE(x) reverse(all(x))
#define CLEAR(x,c) memset(x,c,sizeof(x)) 
#define amfor(Iterator, Container) 	for ( auto Iterator = begin(Container); (Iterator) != end(Container); ++(Iterator) )
#define ramfor(Iterator, Container) for ( auto Iterator = Container.rbegin(); (Iterator) != Container.rend(); ++(Iterator) )
template<class C, class E> inline bool contains(const C& container, const E& element) { return container.find(element) != container.end(); }
#define  NP(nn,ta,a,tb,b) struct nn : pair<ta,tb> { nn():pair<ta,tb>(){}; nn(ta pa,tb pb):pair<ta,tb>(pa,pb){} ta& a(){return first;} tb& b(){return second;} };
template<class T> inline void checkmin(T &a, T b) { if (b < a) a = b; }//asigna en a el minimo
template<class T> inline void checkmax(T &a, T b) { if (b > a) a = b; }//asigna en a el maximo


typedef long long ll;
using namespace std; // since cin and cout are both in namespace std, this saves some text
typedef vector<ll> vll;
typedef vector<vector<ll>> vvll;


//[n][m]
int n, m;

vector<vector<int>> d;

vector<int> Dif(int i, int maxC)
{
	vector<int> res;
	REP(j, m)
	{
		if (d[0][j] != d[i][j])
			res.push_back(j);
		if (res.size() == maxC)
			return res;
	}
	return res;
}

bool Check(int changes)
{
	int maxC = changes + 2;
	FOR(i, 1, n - 1)
	{
		auto difs = Dif(i, maxC + 1);
		if (difs.size() == maxC + 1)
			return false;
		if (difs.size() == 3)
		{
			REP(j, 3)
			{
				int difIndex = difs[j];
				int prev = d[0][difIndex];
				d[0][difIndex] = d[i][difIndex];
				if (Check(changes - 1))
					return true;
				d[0][difIndex] = prev;
			}
			return false;
		}
		else if (difs.size() == 4)
		{
			FOR(j,0,2)
			{
				FOR(k, j + 1, 3)
				{
					int difIndex1 = difs[j];
					int difIndex2 = difs[k];
					int prev1 = d[0][difIndex1];
					int prev2 = d[0][difIndex2];
					d[0][difIndex1] = d[i][difIndex1];
					d[0][difIndex2] = d[i][difIndex2];
					if (Check(changes - 2))
						return true;
					d[0][difIndex1] = prev1;
					d[0][difIndex2] = prev2;
				}
			}
			return false;
		}
	}
	return true;
}
int main()
{
	ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
	cout << std::setprecision(15);
	cout << std::fixed;
	cin >> n >> m;
	d = vector<vector<int>>(n, vector<int>(m));
	REP(i, n)
	{
		REP(j, m)
			cin >> d[i][j];
	}
	
	if (Check(2))
	{
		cout << "Yes" << endl;
		REP(i, m)
			cout << d[0][i] << " ";
	}
	else
		cout << "No" << endl;

	return 0;
}