#include <bits/stdc++.h>
using namespace std;
bool isprime[0];
void Sieve_Atkin(int N) {
  int sqrtN = sqrt((double)N);
  for (int x = 1; x < sqrtN + 1; x++)
    for (int y = 1; y < sqrtN + 1; y++) {
      int n = 4 * x * x + y * y;
      if (n <= N && (n % 12 == 1 || n % 12 == 5)) isprime[n] ^= 1;
      n = 3 * x * x + y * y;
      if (n <= N && n % 12 == 7) isprime[n] ^= 1;
      n = 3 * x * x - y * y;
      if (n <= N && x > y && n % 12 == 11) isprime[n] ^= 1;
    }
  isprime[2] = isprime[3] = true;
  for (int k, n = 5; n <= sqrtN; ++n)
    if (isprime[n])
      while ((k += n * n) <= N) isprime[k] = false;
}
struct Arco {
  int v, next;
  Arco() {}
  Arco(int v, int n) : v(v), next(n) {}
} edges[0];
int E, last[0];
void addEdge(int v, int u) {
  edges[E] = Arco(u, last[v]);
  last[v] = E++;
}
long long GCD(long long a, long long b) {
  while (b) {
    a %= b;
    a ^= b ^= a ^= b;
  }
  return a;
}
int nums[10][10], orden[10];
int main() {
  char cad[12];
  int n, k, i, dife = 1e9, j, x = 0;
  scanf("%d%d", &n, &k);
  for (i = 0; i < n; i++) {
    scanf("%s", cad);
    for (j = 0; j < k; j++) nums[i][j] = cad[j] - '0';
  }
  for (i = 0; i < k; i++) orden[i] = i;
  do {
    int men = 1e9, may = 0;
    for (i = 0; i < n; i++) {
      for (x = j = 0; j < k; j++) x = x * 10 + nums[i][orden[j]];
      if (x > may) may = x;
      if (x < men) men = x;
    }
    dife = min(dife, may - men);
  } while (next_permutation(orden, orden + k));
  printf("%d\n", dife);
  return 0;
}
