#include <stdio.h>

#define MAX 21
#define MAXMASK 1025
#define INF 100000

int r, c, dirty;
char s[MAX][MAX];
int dp[MAX][MAX][MAXMASK];

int getMin(int a, int b) {return (a < b ? a : b);}

int bfs(int x, int y, int mask) {
    if (s[x][y] == 'x') return INF;
    if (s[x][y] >= 'a' && s[x][y] <= 'n') {
        int dig = s[x][y]-'a';
        mask |= (1<<dig);
    }
    if (mask == dirty) return 0;
    if (dp[x][y][mask] >= 0) return dp[x][y][mask];
    if (dp[x][y][mask] == -2) return INF;
    int min = INF;
    dp[x][y][mask] = -2;
    if (x > 0) min = getMin(min, bfs(x-1, y, mask));
    if (y > 0) min = getMin(min, bfs(x, y-1, mask));
    if (x < r-1) min = getMin(min, bfs(x+1, y, mask));
    if (y < c-1) min = getMin(min, bfs(x, y+1, mask));
    if (min != INF) min++;
    dp[x][y][mask] = min;
    return min;
}

int main(void) {
    int ans, sx, sy, i, j, k;
    while (1) {
        scanf("%d %d", &c, &r);
        if (c == 0) break;
        dirty = 0;
        for (i=0; i<r; i++) scanf("%s", s[i]);
        for (i=0; i<r; i++) {
            for (j=0; j<c; j++) {
                if (s[i][j] == '*') {
                    s[i][j] = 'a'+dirty;
                    dirty++;
                } else if (s[i][j] == 'o') sx = i, sy = j;
            }
        }
        dirty = (1<<dirty) - 1;
        for (i=0; i<MAX; i++) {
            for (j=0; j<MAX; j++) {
                for (k=0; k<MAXMASK; k++) dp[i][j][k] = -1;
            }
        }
        ans = bfs(sx, sy, 0);
        if (ans >= INF) printf("-1\n");
        else printf("%d\n", ans);
    }
    return 0;
}