#include <bits/stdc++.h>
long long gcd(long long a, long long b) {
  if (!b) return a;
  return gcd(b, a % b);
}
long long fastpow(long long a, long long p) {
  long long ans = 1;
  for (; p; p >> 1, a = a * a % 1000000007)
    if (p & 1) ans = ans * a % 1000000007;
  return ans;
}
void read(int &x) {
  x = 0;
  int f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while ('0' <= ch && ch <= '9') x = x * 10 + ch - '0', ch = getchar();
  x *= f;
}
void read(long long &x) {
  x = 0;
  long long f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while ('0' <= ch && ch <= '9') x = x * 10 + ch - '0', ch = getchar();
  x *= f;
}
using namespace std;
int n, m, g;
int a[100005], x[100005], y[100005], z[100005], t[100005];
int getrand() { return (rand() << 15 ^ rand()) & (~0u >> 1); }
int gcd(int a, int b) {
  if (!b) return a;
  return gcd(b, a % b);
}
map<int, int> ma;
int work(int *x, int n, int m, int T = 0) {
  if (T > 40) return -1;
  if (m <= 50) {
    ma.clear();
    for (int i = 1; i <= m; i++)
      for (int j = 1; j <= m; j++)
        if (i != j)
          if (gcd((x[i] - x[j] + n) % n, n) == 1 &&
              ++ma[(x[i] - x[j] + n) % n] == m - 1)
            return (x[i] - x[j] + n) % n;
    return -1;
  }
  if (m == n - 1) return 1;
  int w = x[getrand() % m + 1];
  int ycnt = 0, zcnt = 0, tcnt = 0;
  if (w * 2 < n)
    for (int i = 1; i <= m; i++)
      if (w * 2 - x[i] < 0)
        y[++ycnt] = w * 2 - x[i] + n;
      else
        z[++zcnt] = w * 2 - x[i];
  else
    for (int i = 1; i <= m; i++)
      if (w * 2 - x[i] < n)
        y[++ycnt] = w * 2 - x[i];
      else
        z[++zcnt] = w * 2 - x[i] - n;
  int i = 1, j = ycnt, k = zcnt;
  while (i <= m) {
    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[++tcnt] = x[i];
    i++;
  }
  if (tcnt > 1) {
    memcpy(x, t, tcnt + 1 << 2);
    return work(x, n, tcnt, T + 1);
  }
  return work(x, n, m, T + 1);
}
int main() {
  cin >> n >> m;
  g = n;
  x[0] = n;
  for (int i = 1; i <= m; i++) scanf("%d", &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]);
    return 0;
  }
  if (m == n / g) {
    printf("%d %d\n", x[1], g);
    return 0;
  }
  for (int i = 1; i <= m; i++) a[i] = x[i] / g;
  int d = work(a, n / g, m);
  if (d == -1) {
    printf("%d", -1);
    return 0;
  }
  d *= g;
  int s = x[1], k = 0;
  for (int i = 1; i <= m; i++)
    if (!binary_search(x + 1, x + m + 1, (x[i] + d) % n)) k++, s = x[i];
  if (k <= 1)
    printf("%d %d\n", s, (n - d) % n);
  else
    printf("%d\n", -1);
  return 0;
}
