#include "bits/stdc++.h"

using namespace std;

typedef long long ll;
typedef pair<int,int> P;
const double EPS = 1e-12;
const int INF = numeric_limits<int>::max()/2;
const int MOD = 1e9+7;

int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};

int main(){
    cin.tie(0);
    ios::sync_with_stdio(false);

    int w,h;
    while(cin>>w>>h, w||h){
        vector<string> s(h);
        for(int i=0;i<h;i++) cin>>s[i];
        vector<vector<int>> dis(1000,vector<int>(1000,INF));
        for(int i=0;i<h*w;i++) dis[i][i]=0;
        vector<P> dirty;
        int sx,sy;
        for(int i=0;i<h;i++){
            for(int j=0;j<w;j++){
                if(s[i][j]=='x') continue;
                if(s[i][j]=='*') dirty.push_back(P(i,j));
                if(s[i][j]=='o'){
                    sx=i;sy=j;
                }

                for(int k=0;k<4;k++){
                    int nx=i+dx[k],ny=j+dy[k];
                    if(nx<0 || h<=nx || ny<0 || w<=ny) continue;
                    if(s[nx][ny]=='x') continue;
                    int st=i*w+j,gt=nx*w+ny;
                    dis[st][gt]=1;
                }
            }
        }
        for(int k=0;k<h*w;k++){
            for(int i=0;i<h*w;i++){
                for(int j=0;j<h*w;j++){
                    dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
                }
            }
        }
        int sz=dirty.size();
        ll res=INF;
        do{
            int sx2=sx,sy2=sy;
            ll tmp=0;
            for(int i=0;i<sz;i++){
                int nx=dirty[i].first,ny=dirty[i].second;
                tmp+=dis[sx2*w+sy2][nx*w+ny];
                sx2=nx;sy2=ny;
            }
            res=min(res,tmp);
        }while(next_permutation(dirty.begin(),dirty.end()));
        if(res>=INF) cout<<-1<<endl;
        else cout<<res<<endl;
    }
}
