#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int, int>
#define pii2 pair<pii, int>
using namespace std;
const int N = 17;
const int MASK = (1 << N);
const int mod = 1e9 + 7;
const int oo = 1e9;
int n, m, sx, sy, dp[N][MASK], c[N][N], ord = 0, ans = oo;
char a[N][N];
map <pii, int> s;
int dx[5] = {0, 0, 0, -1, 1};
int dy[5] = {0, 1, -1, 0, 0};
void bfs(int x, int y, int ord) {
vector <vector<bool>> vis(n + 1, vector<bool>(m + 1, 0));
vector <vector<int>> d(n + 1, vector<int>(m + 1, 0));
queue <pii> q;
q.push({x, y});
vis[x][y] = 1; d[x][y] = 0;
while(!q.empty()) {
pii t = q.front(); q.pop();
int x = t.fi;
int y = t.se;
for(int i = 1; i <= 4; i ++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (!(0 <= nx && nx < n && 0 <= ny && ny < m)) continue;
if (a[nx][ny] == 'x') continue;
if (!vis[nx][ny]) {
vis[nx][ny] = 1;
d[nx][ny] = d[x][y] + 1;
if (a[nx][ny] == '*' || a[nx][ny] == 'o') {
int ord2 = s[{nx, ny}];
c[ord][ord2] = d[nx][ny];
c[ord2][ord] = d[nx][ny];
}
q.push({nx, ny});
}
}
}
}
void print(int mask) {
cout << bitset <5> (mask) << '\n' << '\n';
for(int mask = 0; mask < (1 << ord); mask ++) {
for(int i = 1; i <= ord; i ++) {
cout << dp[i][mask] << " ";
}
cout << '\n';
}
cout << '\n' << '\n';
}
void solve() {
while(cin >> m >> n) {
if (m == 0 && n == 0) return;
ans = oo;
ord = 0;
for(int i = 0; i < n; i ++)
for(int j = 0; j < m; j ++)
cin >> a[i][j];
for(int i = 0; i < n; i ++) {
for(int j = 0; j < m; j ++) {
if (!(a[i][j] == '*' || a[i][j] == 'o')) continue;
s[{i, j}] = ++ord;
if (a[i][j] == 'o') {
sx = i;
sy = j;
}
}
}
for(int i = 1; i <= ord; i ++) {
for(int j = 1; j <= ord; j ++) {
c[i][j] = oo;
}
}
for(pii2 tt : s) {
pii t = tt.fi;
int t_ord = tt.se;
bfs(t.fi, t.se, t_ord);
}
for(int mask = 0; mask < (1 << ord); mask ++) {
for(int i = 1; i <= ord; i ++) {
dp[i][mask] = oo;
}
}
int order = s[{sx, sy}];
dp[order][(1 << (order - 1))] = 0;
for(int mask = 0; mask < (1 << ord); mask ++) {
vector <int> pos;
for(int i = 0; i < ord; i ++) if ((mask >> i) & 1) pos.push_back(i);
for(int i : pos) for(int j : pos) {
if (i == j) continue;
dp[i + 1][mask] = min(dp[i + 1][mask], dp[j + 1][mask ^ (1 << i)] + c[i + 1][j + 1]);
}
// print(mask);
}
for(int i = 1; i <= ord; i ++) {
ans = min(ans, dp[i][(1 << ord) - 1]);
}
cout << (ans == oo ? -1 : ans) << '\n';
s.clear();
}
}
signed main() {
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
solve();
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgZmkgZmlyc3QKI2RlZmluZSBzZSBzZWNvbmQKI2RlZmluZSBwaWkgcGFpcjxpbnQsIGludD4KI2RlZmluZSBwaWkyIHBhaXI8cGlpLCBpbnQ+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKY29uc3QgaW50IE4gPSAxNzsKY29uc3QgaW50IE1BU0sgPSAoMSA8PCBOKTsKY29uc3QgaW50IG1vZCA9IDFlOSArIDc7CmNvbnN0IGludCBvbyA9IDFlOTsKIAppbnQgbiwgbSwgc3gsIHN5LCBkcFtOXVtNQVNLXSwgY1tOXVtOXSwgb3JkID0gMCwgYW5zID0gb287CmNoYXIgYVtOXVtOXTsKbWFwIDxwaWksIGludD4gczsKaW50IGR4WzVdID0gezAsIDAsIDAsIC0xLCAxfTsKaW50IGR5WzVdID0gezAsIDEsIC0xLCAwLCAwfTsKIAp2b2lkIGJmcyhpbnQgeCwgaW50IHksIGludCBvcmQpIHsKICAgIHZlY3RvciA8dmVjdG9yPGJvb2w+PiB2aXMobiArIDEsIHZlY3Rvcjxib29sPihtICsgMSwgMCkpOwogICAgdmVjdG9yIDx2ZWN0b3I8aW50Pj4gZChuICsgMSwgdmVjdG9yPGludD4obSArIDEsIDApKTsKICAgIHF1ZXVlIDxwaWk+IHE7CiAgICBxLnB1c2goe3gsIHl9KTsKICAgIHZpc1t4XVt5XSA9IDE7IGRbeF1beV0gPSAwOwogICAgd2hpbGUoIXEuZW1wdHkoKSkgewogICAgICAgIHBpaSB0ID0gcS5mcm9udCgpOyBxLnBvcCgpOwogICAgICAgIGludCB4ID0gdC5maTsKICAgICAgICBpbnQgeSA9IHQuc2U7CiAgICAgICAgZm9yKGludCBpID0gMTsgaSA8PSA0OyBpICsrKSB7CiAgICAgICAgICAgIGludCBueCA9IHggKyBkeFtpXTsKICAgICAgICAgICAgaW50IG55ID0geSArIGR5W2ldOwogICAgICAgICAgICBpZiAoISgwIDw9IG54ICYmIG54IDwgbiAmJiAwIDw9IG55ICYmIG55IDwgbSkpIGNvbnRpbnVlOwogICAgICAgICAgICBpZiAoYVtueF1bbnldID09ICd4JykgY29udGludWU7CiAgICAgICAgICAgIGlmICghdmlzW254XVtueV0pIHsKICAgICAgICAgICAgICAgIHZpc1tueF1bbnldID0gMTsKICAgICAgICAgICAgICAgIGRbbnhdW255XSA9IGRbeF1beV0gKyAxOwogICAgICAgICAgICAgICAgaWYgKGFbbnhdW255XSA9PSAnKicgfHwgYVtueF1bbnldID09ICdvJykgewogICAgICAgICAgICAgICAgICAgIGludCBvcmQyID0gc1t7bngsIG55fV07CiAgICAgICAgICAgICAgICAgICAgY1tvcmRdW29yZDJdID0gZFtueF1bbnldOwogICAgICAgICAgICAgICAgICAgIGNbb3JkMl1bb3JkXSA9IGRbbnhdW255XTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHEucHVzaCh7bngsIG55fSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0Kdm9pZCBwcmludChpbnQgbWFzaykgewogICAgY291dCA8PCBiaXRzZXQgPDU+IChtYXNrKSA8PCAnXG4nIDw8ICdcbic7CiAgICBmb3IoaW50IG1hc2sgPSAwOyBtYXNrIDwgKDEgPDwgb3JkKTsgbWFzayArKykgewogICAgICAgIGZvcihpbnQgaSA9IDE7IGkgPD0gb3JkOyBpICsrKSB7CiAgICAgICAgICAgIGNvdXQgPDwgZHBbaV1bbWFza10gPDwgIiAiOwogICAgICAgIH0KICAgICAgICBjb3V0IDw8ICdcbic7CiAgICB9CiAgICBjb3V0IDw8ICdcbicgPDwgJ1xuJzsKfQp2b2lkIHNvbHZlKCkgewogICAgd2hpbGUoY2luID4+IG0gPj4gbikgewogICAgICAgIGlmIChtID09IDAgJiYgbiA9PSAwKSByZXR1cm47CiAgICAgICAgYW5zID0gb287CiAgICAgICAgb3JkID0gMDsKICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbjsgaSArKykKICAgICAgICAgICAgZm9yKGludCBqID0gMDsgaiA8IG07IGogKyspCiAgICAgICAgICAgICAgICBjaW4gPj4gYVtpXVtqXTsKIAogICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBuOyBpICsrKSB7CiAgICAgICAgICAgIGZvcihpbnQgaiA9IDA7IGogPCBtOyBqICsrKSB7CiAgICAgICAgICAgICAgICBpZiAoIShhW2ldW2pdID09ICcqJyB8fCBhW2ldW2pdID09ICdvJykpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgc1t7aSwgan1dID0gKytvcmQ7CiAgICAgICAgICAgICAgICBpZiAoYVtpXVtqXSA9PSAnbycpIHsKICAgICAgICAgICAgICAgICAgICBzeCA9IGk7CiAgICAgICAgICAgICAgICAgICAgc3kgPSBqOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvcihpbnQgaSA9IDE7IGkgPD0gb3JkOyBpICsrKSB7CiAgICAgICAgICAgIGZvcihpbnQgaiA9IDE7IGogPD0gb3JkOyBqICsrKSB7CiAgICAgICAgICAgICAgICBjW2ldW2pdID0gb287CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZm9yKHBpaTIgdHQgOiBzKSB7CiAgICAgICAgICAgIHBpaSB0ID0gdHQuZmk7CiAgICAgICAgICAgIGludCB0X29yZCA9IHR0LnNlOwogICAgICAgICAgICBiZnModC5maSwgdC5zZSwgdF9vcmQpOwogICAgICAgIH0KICAgICAgICBmb3IoaW50IG1hc2sgPSAwOyBtYXNrIDwgKDEgPDwgb3JkKTsgbWFzayArKykgewogICAgICAgICAgICBmb3IoaW50IGkgPSAxOyBpIDw9IG9yZDsgaSArKykgewogICAgICAgICAgICAgICAgZHBbaV1bbWFza10gPSBvbzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpbnQgb3JkZXIgPSBzW3tzeCwgc3l9XTsKICAgICAgICBkcFtvcmRlcl1bKDEgPDwgKG9yZGVyIC0gMSkpXSA9IDA7CiAgICAgICAgZm9yKGludCBtYXNrID0gMDsgbWFzayA8ICgxIDw8IG9yZCk7IG1hc2sgKyspIHsKICAgICAgICAgICAgdmVjdG9yIDxpbnQ+IHBvczsKICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG9yZDsgaSArKykgaWYgKChtYXNrID4+IGkpICYgMSkgcG9zLnB1c2hfYmFjayhpKTsKICAgICAgICAgICAgZm9yKGludCBpIDogcG9zKSBmb3IoaW50IGogOiBwb3MpIHsKICAgICAgICAgICAgICAgIGlmIChpID09IGopIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgZHBbaSArIDFdW21hc2tdID0gbWluKGRwW2kgKyAxXVttYXNrXSwgZHBbaiArIDFdW21hc2sgXiAoMSA8PCBpKV0gKyBjW2kgKyAxXVtqICsgMV0pOwogICAgICAgICAgICB9CiAgICAvLyAgICAgICAgcHJpbnQobWFzayk7CiAgICAgICAgfQogICAgICAgIGZvcihpbnQgaSA9IDE7IGkgPD0gb3JkOyBpICsrKSB7CiAgICAgICAgICAgIGFucyA9IG1pbihhbnMsIGRwW2ldWygxIDw8IG9yZCkgLSAxXSk7CiAgICAgICAgfQogICAgICAgIGNvdXQgPDwgKGFucyA9PSBvbyA/IC0xIDogYW5zKSA8PCAnXG4nOwogICAgICAgIHMuY2xlYXIoKTsKICAgIH0KfQpzaWduZWQgbWFpbigpIHsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oMCk7IGNpbi50aWUoMCk7IGNvdXQudGllKDApOwogICAgc29sdmUoKTsKfQ==