#include <bits/stdc++.h>
using namespace std;
#define MAXN 4105
#define int long long
int n,m,k;
vector<string> vec;
map<char,int> mapa;
set<int> position[4][MAXN];
set<int> possible;
int seg[MAXN*4];
void update(int node,int l,int r,int pos,int val)
{
if (l==r) seg[node]+=val;
else
{
int mid=(l+r)/2;
if (pos<=mid) update(2*node,l,mid,pos,val);
else update(2*node+1,mid+1,r,pos,val);
}
}
int query(int node,int l,int r,int pos)
{
if (l==r) return seg[node];
int mid=(l+r)/2;
if (pos<=mid) return query(2*node,l,mid,pos);
else return query(2*node+1,mid+1,r,pos);
}
int32_t main()
{
cin>>n>>m>>k;for (int i=1;i<=n;i++) {string s;cin>>s;vec.push_back(s);}
if (n<=100 and m<=100)
{
// subtask1 - 27p
for (int pos=0;pos<n;pos++)
{
bool valid=true;
for (int i=0;i<n;i++)
{
if (i==pos) continue;
int matching=0;
for (int j=0;j<m;j++)
{
if (vec[pos][j]!=vec[i][j]) matching++;
}
if (matching!=k) {valid=false;break;}
}
if (valid) {cout<<pos+1<<endl;return 0;}
}
}
mapa['A']=0;mapa['C']=1;mapa['G']=2;mapa['T']=3;
for (int pos=1;pos<=n;pos++) possible.insert(pos);
for (int pos=1;pos<=n;pos++)
{
for (int i=0;i<m;i++) position[mapa[vec[pos-1][i]]][i].insert(pos);
}
int answer=-1;
while (answer==-1)
{
int root=*possible.begin();possible.erase(root);
for (int pos=0;pos<m;pos++) position[mapa[vec[root-1][pos]]][pos].erase(root);
for (int node=0;node<4*MAXN;node++) seg[node]=m;
for (int pos=0;pos<m;pos++)
{
for (int sled:position[mapa[vec[root-1][pos]]][pos]) update(1,1,n,sled,-1);
}
vector<int> todelete;
for (int node:possible)
{
if (query(1,1,n,node)==k) continue;
for (int pos=0;pos<m;pos++) position[mapa[vec[node-1][pos]]][pos].erase(node);
todelete.push_back(node);
}
if ((int)todelete.size()==0) {cout<<root<<endl;return 0;}
for (int node:todelete) possible.erase(node);
}
return 0;
}