A string is a palindrome if it reads the same from the left to the right and from the right to the left. For example, the strings "kek", "abacaba", "r" and "papicipap" are palindromes, while the strings "abb" and "iq" are not.

A substring s[l … r] (1 ≤ l ≤ r ≤ |s|) of a string s = s_{1}s_{2} … s_{|s|} is the string s_{l}s_{l + 1} … s_{r}.

Anna does not like palindromes, so she makes her friends call her Ann. She also changes all the words she reads in a similar way. Namely, each word s is changed into its longest substring that is not a palindrome. If all the substrings of s are palindromes, she skips the word at all.

Some time ago Ann read the word s. What is the word she changed it into?

Input

The first line contains a non-empty string s with length at most 50 characters, containing lowercase English letters only.

Output

If there is such a substring in s that is not a palindrome, print the maximum length of such a substring. Otherwise print 0.

Note that there can be multiple longest substrings that are not palindromes, but their length is unique.

Examples

Input

mew


Output

3


Input

wuffuw


Output

5


Input

qqqqqqqq


Output

0

Note

"mew" is not a palindrome, so the longest substring of it that is not a palindrome, is the string "mew" itself. Thus, the answer for the first example is 3.

The string "uffuw" is one of the longest non-palindrome substrings (of length 5) of the string "wuffuw", so the answer for the second example is 5.

All substrings of the string "qqqqqqqq" consist of equal characters so they are palindromes. This way, there are no non-palindrome substrings. Thus, the answer for the third example is 0.
#include <bits/stdc++.h>
using namespace std;
const long long int MOD = 1000000007;
const long long int INF = LONG_MAX;
const vector<vector<long long int> > adj4({{0, 1}, {0, -1}, {1, 0}, {-1, 0}});
const vector<vector<long long int> > adj8(
    {{0, 1}, {0, -1}, {1, 0}, {-1, 0}, {-1, -1}, {1, -1}, {-1, 1}, {1, 1}});
struct DisjointSet {
  vector<long long int> roots;
  vector<long long int> sizes;
  DisjointSet(long long int n) {
    sizes = vector<long long int>(n, 1);
    roots = vector<long long int>(n);
    for (long long int i = 0; i < (n); ++i) roots[i] = i;
  }
  long long int root(long long int a) {
    return roots[a] == a ? a : root(roots[a]);
  }
  void join(long long int a, long long int b) {
    long long int ra = root(a);
    long long int rb = root(b);
    if (sizes[a] > sizes[b]) {
      roots[rb] = ra;
      sizes[ra] += sizes[rb];
    } else {
      roots[ra] = rb;
      sizes[rb] += sizes[ra];
    }
  }
};
long long int gcd(long long int a, long long int b) {
  return b == 0 ? a : gcd(b, a % b);
}
bool isprime(long long int n) {
  if (n == 2 || n == 3) return true;
  if (n < 2 || n % 2 == 0 || n % 3 == 0) return false;
  for (long long int i = 6; (i - 1) * (i - 1) <= n; i += 6) {
    if (n % (i - 1) == 0 || n % (i + 1) == 0) {
      return false;
    }
  }
  return true;
}
vector<bool> sprime;
void genPrime(long long int sz) {
  sprime = vector<bool>(sz, true);
  sprime[0] = false;
  sprime[1] = false;
  for (long long int i = (2); i < (sz); ++i) {
    for (long long int j = i * i; j < sz; j += i) {
      sprime[j] = false;
    }
  }
}
vector<long long int> facts;
bool factGenFlag = false;
void genFact(long long int n) {
  factGenFlag = true;
  facts = vector<long long int>(n + 1);
  facts[0] = 1;
  for (long long int i = (1); i < (n + 1); ++i) {
    facts[i] = facts[i - 1] * i;
  }
}
void genFactMod(long long int n, long long int mod) {
  factGenFlag = true;
  facts = vector<long long int>(n + 1);
  facts[0] = 1;
  for (long long int i = (1); i < (n + 1); ++i) {
    facts[i] = facts[i - 1] * i % mod;
  }
}
long long int fact(long long int a, long long int n) {
  if (factGenFlag && a < 3) return facts[n];
  long long int r = 1;
  for (long long int i = (a); i < (n + 1); ++i) {
    r *= i;
  }
  return r;
}
long long int factMod(long long int a, long long int n, long long int mod) {
  if (factGenFlag && a < 3) return facts[n];
  long long int r = 1;
  for (long long int i = (a); i < (n + 1); ++i) {
    r *= i;
    r %= mod;
  }
  return r;
}
long long int powMod(long long int a, long long int b, long long int mod) {
  long long int n = 1;
  long long int p = a;
  while (b > 0) {
    if (b % 2 == 1) {
      n *= p;
      n %= mod;
    }
    p *= p;
    p %= mod;
    b /= 2;
  }
  return n;
}
long long int modularInverse(long long int a, long long int mod) {
  return powMod(a, mod - 2, mod);
}
long long int ent(long long int a, long long int b) {
  long long int r = fact(a - b + 1, a);
  long long int d = fact(2, b);
  long long int ent = r / d;
  return ent;
}
long long int entMod(long long int a, long long int b, long long int mod) {
  long long int r = factMod(a - b + 1, a, mod);
  long long int d = factMod(2, b, mod);
  long long int ent = r * modularInverse(d, mod) % mod;
  return ent;
}
long long int bsfunction(long long int n) { return 0; }
long long int binarysearch(long long int left, long long int right,
                           long long int target) {
  if (left == right) {
    return left;
  }
  long long int mid =
      (left + right > 0) ? (left + right) / 2 : (left + right - 1) / 2;
  long long int val = bsfunction(mid);
  if (val > target) {
    return binarysearch(left, mid, target);
  } else if (val == target) {
    return mid;
  } else {
    return binarysearch(mid + 1, right, target);
  }
}
vector<long long int> topores;
vector<bool> topovisperm;
vector<bool> topovistemp;
vector<vector<long long int> > topograph;
bool topoimp;
void toposortvisit(long long int step) {
  if (topovisperm[step]) return;
  if (topovistemp[step]) {
    topoimp = true;
    return;
  }
  topovistemp[step] = true;
  for (long long int p : topograph[step]) {
    toposortvisit(p);
    if (topoimp) return;
  }
  topovisperm[step] = true;
  topores.push_back(step);
}
void toposort() {
  long long int n = topograph.size();
  topoimp = false;
  topovistemp = vector<bool>(n, false);
  topovisperm = vector<bool>(n, false);
  topores = vector<long long int>();
  topores.reserve(n);
  for (long long int i = 0; i < (n); ++i) {
    if (!topovisperm[i]) {
      toposortvisit(i);
      if (topoimp) {
        return;
      }
    }
  }
}
stringstream sss;
void MAIN() {
  string s;
  cin >> s;
  string second = s;
  reverse((second).begin(), (second).end());
  while (!s.empty() && s.compare(second) == 0) {
    second.erase(second.begin());
    s.pop_back();
  }
  cout << (s.size()) << endl;
}
const long long int TESTCASEN = 1;
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  sss << R"(
    )";
  for (long long int i = 0; i < (TESTCASEN); ++i) {
    MAIN();
  }
  return 0;
}
