#include <iostream>
#include <vector>
#include <map>
#include <cmath>
#include <algorithm>
#include <queue>
#include <unordered_set>
#include <unordered_map>

using namespace std;

struct Node {
	string str;
	int depth;
	Node(string _str, int _depth) {
		str = _str;
		depth = _depth;
	}
};

class Solver
{
private:
	string str;
	unordered_map<char, int> um;
public:
	Solver() {
		cin >> str;
	}

	bool check(string st) {
		for (int i = 0; i < st.size(); ++i)
		{
			if(st[i] != st[st.size() - 1 - i]) {
				return false;
			}
		}
		return true;
	}

	void exec() {
		if(check(str)) {
			cout << 0 << endl;
			return;
		}

		string new_str = str;
		for (int i = 0; i < new_str.size(); ++i)
		{
			if(new_str[i] == 'x') {
				new_str.erase(i, 1);
				i--;
			}
		}
		// cout << new_str << endl;
		if(check(new_str) == false) {
			cout << -1 << endl;
			return;
		}

		int x_cnt = 0;
		for (int i = 0; i < str.size(); ++i)
		{
			if(str[i] == 'x') {
				x_cnt++;
			} else {
				um[str[i]]++;
			}
		}
		int odd_cnt = 0;
		for (auto itr : um) {
			// cout << itr.first << " " << itr.second << endl;
			if(itr.second % 2 == 1) {
				odd_cnt++;
			}
		}
		
		if(odd_cnt > 1) {
			// cout << odd_cnt << endl;
			cout << -1 << endl;
			return;
		} else if(odd_cnt == 1) {
			int num_except_x = str.size() - x_cnt;
			int tmp_cnt = 0;
			int middle_idx =0;
			for (int i = 0; i < str.size(); ++i)
			{
				if(str[i] != 'x') {
					tmp_cnt++;
					if(tmp_cnt == num_except_x / 2 + 1) {
						middle_idx = i;
						break;
					}
				}
			}
			int i = middle_idx - 1;
			int j = middle_idx + 1;
			int ans = 0;
			while(0 <= i && str.size() - 1 >= j) {
				if(str[i] == str[j]) {
					i--;
					j++;
				} else if(str[i] == 'x') {
					i--;
					ans++;
				} else {
					j++;
					ans++;
				}
			}

			if(i != -1) ans += i + 1;
			if(j != str.size()) ans += str.size() - j;
			cout << ans << endl;
		} else {
			int num_except_x = str.size() - x_cnt;
			int tmp_cnt = 0;
			int middle_idx_1 =0;
			int middle_idx_2 =0;


			for (int i = 0; i < str.size(); ++i)
			{
				if(str[i] != 'x') {
					tmp_cnt++;
					if(tmp_cnt == num_except_x / 2 ) {
						middle_idx_1 = i;
					}
					if(tmp_cnt == num_except_x / 2 +1) {
						middle_idx_2 = i;
					}
				}
			}
			int i = middle_idx_1;
			int j = middle_idx_2;
			int ans = 0;
			while(0 <= i && str.size() - 1 >= j) {
				if(str[i] ==  str[j]) {
					i--;
					j++;
				} else if(str[i] == 'x') {
					i--;
					ans++;
				} else {
					j++;
					ans++;
				}
			}
			if(i != -1) ans += i + 1;
			if(j != str.size()) ans += str.size() - j;
			cout << ans << endl;
		}
		// unordered_map<string, bool> dp;
		// Node start = {str, 0};
		// queue<Node> q;
		// q.push(start);
		// while(!q.empty()) {
		// 	Node cur = q.front();
		// 	q.pop();
		// 	if(check(cur.str)) {
		// 		cout << cur.depth << endl;
		// 		return;
		// 	}
		// 	for (int j = 0; j < cur.str.size(); ++j)
		// 	{
		// 		string tmp = cur.str;
		// 		// cout << tmp << endl;
		// 		// cout << tmp[j] << endl;
		// 		if(tmp[j] == 'x') {
		// 			tmp.erase(j, 1);
		// 			// cout << tmp << endl;
		// 			if(dp.find(tmp) == dp.end()){
		// 				dp[tmp] = true;
		// 				// cout << tmp << endl;
		// 				q.push(Node(tmp, cur.depth + 1));
		// 			}
		// 		}
		// 	}
		// }
		// cout << -1 << endl;
	}
	
};

int main() {
	Solver ce = Solver();
	ce.exec();
}


Measured memory_bytes: 512