#include <bits/stdc++.h>
using namespace std;
const int SIZE = 500010;
const int INF = 2147483640;
const double eps = 1e-8;
inline void RD(int &x) {
  x = 0;
  char c;
  c = getchar();
  bool flag = 0;
  if (c == '-') flag = 1;
  while (c < '0' || c > '9') {
    if (c == '-') {
      flag = 1;
    }
    c = getchar();
  }
  while (c >= '0' && c <= '9') x = (x << 1) + (x << 3) + c - '0', c = getchar();
}
long long num[SIZE];
long long s1, s2, d, a1;
long long yz[SIZE];
long long inv(long long a, long long b, long long mod) {
  long long ret = 1;
  while (b) {
    if (b & 1) ret = ret * a % mod;
    a = a * a % mod;
    b >>= 1;
  }
  return ret;
}
int n;
long long m, tmp;
int main(int argc, char const *argv[]) {
  scanf("%I64d%d", &m, &n);
  s1 = s2 = 0;
  for (int i = 1; i <= n; i++) {
    scanf("%I64d", &num[i]);
    s1 += num[i];
    s2 += num[i] * num[i];
    s1 %= m;
    s2 %= m;
  }
  if (n == 1) {
    printf("%lld 1\n", num[1]);
    return 0;
  }
  sort(num + 1, num + 1 + n);
  for (int i = 2; i <= n; i++) {
    d = (num[i] - num[1] + m) % m;
    a1 = (s1 % m -
          ((n % m * (n - 1) % m) % m * inv(2, m - 2, m) % m * d % m) % m + m) %
         m * inv(n, m - 2, m) % m;
    tmp = (n * a1) % m * a1 % m;
    tmp = (tmp + ((n % m * (n - 1) % m * (2 * n - 1) % m) % m * d % m * d % m *
                  inv(6, m - 2, m) % m)) %
          m;
    tmp = (tmp + n % m * (n - 1) % m * d % m * a1 % m) % m;
    if (tmp == s2) {
      yz[1] = a1;
      for (int k = 2; k <= n; k++) yz[k] = (yz[k - 1] + d) % m;
      sort(yz + 1, yz + 1 + n);
      bool flag = 1;
      for (int k = 1; k <= n; k++) {
        if (yz[k] != num[k]) {
          flag = 0;
          break;
        }
      }
      if (flag) {
        printf("%I64d %I64d\n", a1, d);
        return 0;
      }
    }
  }
  printf("-1\n");
  return 0;
}
