#include <bits/stdc++.h>
const int mo = 10007, N = 205;
int f[N][N][N], t;
char s[N];
struct M {
  int a[N * 2][N * 2];
};
M operator*(M A, M B) {
  M C;
  for (int i = 0; i < t; i++)
    for (int j = i; j < t; j++) {
      C.a[i][j] = 0;
      for (int k = i; k <= j; k++)
        C.a[i][j] = (C.a[i][j] + A.a[i][k] * B.a[k][j]) % mo;
    }
  return C;
}
M operator^(M A, int B) {
  M C;
  for (int i = 0; i < t; i++)
    for (int j = i; j < t; j++) C.a[i][j] = (i == j);
  for (; B; B >>= 1, A = A * A)
    if (B & 1) C = C * A;
  return C;
}
int main() {
  int n, ans = 0;
  scanf("%s%d", s + 1, &n);
  int m = strlen(s + 1);
  f[1][m][0] = 1;
  n += m;
  for (int i = 1; i <= m; i++)
    for (int j = m; j >= i; j--)
      for (int k = 0; k < m; k++)
        if (s[i] == s[j])
          (f[i + 1][j - 1][k] += f[i][j][k]) %= mo;
        else {
          (f[i + 1][j][k + 1] += f[i][j][k]) %= mo;
          (f[i][j - 1][k + 1] += f[i][j][k]) %= mo;
        }
  M A;
  for (int i = 0; i < m - 1; i++) A.a[i][i] = 24, A.a[i][i + 1] = 1;
  for (int i = 0; i < (m + 1) / 2; i++) {
    A.a[m - 1 + i][m - 1 + i] = 25;
    A.a[m - 1 + i + (m + 1) / 2][m - 1 + i + (m + 1) / 2] = 26;
    A.a[m - 1 + i][m - 1 + i + (m + 1) / 2] = 1;
    if (i < (m + 1) / 2 - 1) A.a[m - 1 + i][m + i] = 1;
  }
  t = m - 1 + (m + 1) / 2 * 2;
  M B = A;
  A = A ^ (n / 2);
  if (n & 1) {
    for (int k = m - 2; k >= 0; k -= 2) {
      int v = 0;
      for (int i = 2; i <= m + 1; i++) v += f[i][i - 1][k];
      ans = (ans - v % mo * A.a[m - 1 - k][m - 2 + (m - k) / 2]) % mo;
    }
    A = A * B;
  }
  for (int k = 0; k < m; k++) {
    int v = 0;
    for (int i = 1; i <= m + 1; i++)
      for (int j = i - 1; j >= i - 2 && j >= 0; j--) v += f[i][j][k];
    ans =
        (ans + v % mo * A.a[m - 1 - k][m - 2 + (m + 1) / 2 + (m - k + 1) / 2]) %
        mo;
  }
  printf("%d\n", (ans + mo) % mo);
}
