#include <iostream>
#include <queue>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;

typedef pair<int, int> pii;
int const dx[] = {1,0,-1,0};
int const dy[] = {0,1,0,-1};

char mat[20][20];
int dis[11][20][20];
int m;
vector<int> px, py;
int done[11];
int ans;
int sp;

void rec(int n, int np, int len)
{
  if (n == m) {
    
    ans = min(len, ans);
    return;
  }
  for (int i=0; i<m; i++) {
    if (!done[i]) {
      if (len+dis[np][px[i]][py[i]] < ans) {
        done[i] = 1;
        rec(n+1, i, len+dis[np][px[i]][py[i]]);
        done[i] = 0; 
        // cout << ret << endl;;
      }
    }
  }
  return;
}

int main()
{
  int w, h;
  while (cin >> w >> h && (w || h)) {
    int sx, sy, sp;
    // char mat[w][h];
    px.clear(); py.clear();
    string str;
    m = 0;
    for (int i=0; i<h; i++) {
      cin >> str;
      for (int j=0; j<w; j++) {
        char x = str[j];
        if (x == 'o') {
          sx = j; sy = i;
          sp = m;
          x = '*';
        }
        if (x == '*') {
          px.push_back(j);
          py.push_back(i);
          m++;
        }
        mat[j][i] = x;
      }
    }
    // for (int i=0; i<h; i++) {
    //   for (int j =0; j<w; j++) {
    //     cout << mat[j][i];
    //   }
    //   cout << endl;
    // }
    // cout << endl;
    // ツ仰猟猟」ツ行ツ療アツづ個催ャツ青ャ
    // int dis[10][w][h];
    memset(dis, 0, sizeof(dis));
    for (int i=0; i<m; i++) {
      queue<pii> Q;
      Q.push(pii(px[i],py[i]));
      while (!Q.empty()) {
        int x = Q.front().first;
        int y = Q.front().second;
        Q.pop();
        for (int k=0; k<4; k++) {
          int xx = x + dx[k];
          int yy = y + dy[k];
          if ((xx < 0 || xx >= w) || (yy < 0 || yy >= h)) continue;
          if (mat[xx][yy] == 'x') continue;
          if (dis[i][xx][yy] != 0 || (xx == px[i] && yy == py[i])) continue;
          dis[i][xx][yy] = dis[i][x][y] + 1;
          Q.push(pii(xx,yy));
        }
      }
    }
    // for (int k = 0; k<m; k++) {
    //   for (int i=0; i<h; i++) {
    //     for (int j =0; j<w; j++) {
    //       cout << dis[k][j][i] << " ";
    //     }
    //     cout << endl;
    //   }
    //   cout << endl;
    // }
    int f = 0;
    for (int i = 0; i < m; i++) {
      if (dis[sp][px[i]][py[i]] == 0 && (i != sp)) {
        cout << -1 << endl;
        f = 1;
        break;
      }
    }
    if (f) continue;
    
    memset(done,0,sizeof(done));
    done[sp] = 1;
    ans = 10000;
    rec(1, sp, 0);
    cout << ans << endl;
  }
}