#include <map> #include <vector> #include <cstdio> #include <cstring> #include <iostream> #define INF 10000000 using namespace std; typedef long long LL; map<string,int> idcache; vector<string> setcache; int ID(string& str){ if(idcache.count(str)) return idcache[str]; setcache.push_back(str); return idcache[str]=setcache.size()-1; } struct node{ int x,y; node(){} node(int a,int b):x(a),y(b){} bool operator <(const node& rhs)const{ return x<rhs.x||x==rhs.x&&y<rhs.y; } }; map<node,int> vis; int n,m,maze[10010][15]; char te[100],str[100]; int main() { while(scanf("%d %d",&n,&m)==2){ gets(str); idcache.clear(); setcache.clear(); for(int i=0;i<n;i++) { int jj=0; gets(str); int len=strlen(str),kk=0; for(int j=0;j<len;j++){ if(str[j]!=','&&j!=len-1){ te[kk++]=str[j]; } else{ if(j==len-1) te[kk++]=str[j]; te[kk]=0; string ss=te; maze[i][jj++]=ID(ss); kk=0; } } } bool flag=false; for(int i=0;i<m;i++){ for(int j=i+1;j<m;j++){ vis.clear(); for(int k=0;k<n;k++){ node p(maze[k][i],maze[k][j]); if(!vis.count(p)){ vis[p]=k; } else{ flag=true; printf("NO\n"); printf("%d %d\n",vis[p]+1,k+1); printf("%d %d\n",i+1,j+1); break; } } if(flag) break; } if(flag) break; } if(!flag) printf("YES\n"); } return 0; }