#include <bits/stdc++.h>
using namespace std;
inline void getint(int &x);
const int MAXN = 1000111;
int n, m, G, a[MAXN], x[MAXN], y[MAXN], z[MAXN], t[MAXN];
map<int, int> mp_cc;
inline int rrandd() { return (rand() << 15 ^ rand()) & (~0u >> 1); }
inline int gcd(const int &a, const int &b) { return b ? gcd(b, a % b) : a; }
inline void getint(int &x) {
  char c;
  while (c = getchar(), c < '0' || c > '9')
    ;
  x = c - '0';
  while (c = getchar(), c >= '0' && c <= '9') x = x * 10 + c - '0';
}
inline void init() {
  getint(n), getint(m);
  G = n;
  x[0] = n;
  for (int i = 1; i <= m; i++) {
    getint(x[i]);
  }
  sort(x + 1, x + m + 1);
  for (int i = 1; i <= m; i++) G = gcd(G, x[i] - x[1]);
  if (m == 1) {
    printf("%d 1\n", x[1]);
    exit(0);
  }
  if (m == n / G) {
    printf("%d %d\n", x[1], G);
    exit(0);
  }
  for (int i = 1; i <= m; i++) a[i] = x[i] / G;
}
inline int work(int *x, int n, int m, int ljhtimes = 0) {
  if (ljhtimes > 40) return -1;
  if (m <= 50) {
    mp_cc.clear();
    for (int i = 1; i <= m; i++) {
      for (int j = 1; j <= m; j++) {
        if (i != j) {
          int d;
          d = (x[i] - x[j] + n) % n;
          if (gcd(d, n) == 1 && ++mp_cc[d] == m - 1) return d;
        }
      }
    }
    return -1;
  }
  if (m == n - 1) return 1;
  int w = x[rrandd() % m + 1], my = 0, mz = 0, mt = 0;
  if (w * 2 < n) {
    for (int i = 1; i <= m; i++) {
      if (w * 2 - x[i] < 0)
        y[++my] = w * 2 - x[i] + n;
      else
        z[++mz] = w * 2 - x[i];
    }
  } else {
    for (int i = 1; i <= m; i++) {
      if (w * 2 - x[i] < n)
        y[++my] = w * 2 - x[i];
      else
        z[++mz] = w * 2 - x[i] - n;
    }
  }
  int i = 1;
  int j = my;
  int k = mz;
  for (; i <= m; i++) {
    while (j && y[j] < x[i]) j--;
    while (k && z[k] < x[i]) k--;
    if ((!j || x[i] != y[j]) && (!k || x[i] != z[k])) t[++mt] = x[i];
  }
  if (mt > 1) {
    memcpy(x, t, mt + 1 << 2);
    return work(x, n, mt, ljhtimes + 1);
  }
  return work(x, n, m, ljhtimes + 1);
}
inline void ljh2000_work() {
  init();
  int d = work(a, n / G, m);
  if (d == -1) {
    puts("-1");
    return;
  }
  d *= G;
  int s = x[1], ljhAK = 0;
  for (int i = 1; i <= m; i++)
    if (!binary_search(x + 1, x + m + 1, (x[i] + d) % n)) {
      ljhAK++;
      s = x[i];
    }
  if (ljhAK <= 1)
    printf("%d %d\n", s, (n - d) % n);
  else
    puts("-1");
}
int main() {
  ljh2000_work();
  return 0;
}
