#include <bits/stdc++.h>
using namespace std;

#define dump(...) cout<<"# "<<#__VA_ARGS__<<'='<<(__VA_ARGS__)<<endl
#define repi(i,a,b) for(int i=int(a);i<int(b);i++)
#define peri(i,a,b) for(int i=int(b);i-->int(a);)
#define rep(i,n) repi(i,0,n)
#define per(i,n) peri(i,0,n)
#define all(c) begin(c),end(c)
#define mp make_pair
#define mt make_tuple

typedef unsigned int uint;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<ll> vl;
typedef vector<vl> vvl;
typedef vector<double> vd;
typedef vector<vd> vvd;
typedef vector<string> vs;

template<typename T1,typename T2>
ostream& operator<<(ostream& os,const pair<T1,T2>& p){
	return os<<'('<<p.first<<','<<p.second<<')';
}

template<typename Tuple>
void print_tuple(ostream&,const Tuple&){}
template<typename Car,typename... Cdr,typename Tuple>
void print_tuple(ostream& os,const Tuple& t){
	print_tuple<Cdr...>(os,t);
	os<<(sizeof...(Cdr)?",":"")<<get<sizeof...(Cdr)>(t);
}
template<typename... Args>
ostream& operator<<(ostream& os,const tuple<Args...>& t){
	print_tuple<Args...>(os<<'(',t);
	return os<<')';
}

template<typename Ch,typename Tr,typename C>
basic_ostream<Ch,Tr>& operator<<(basic_ostream<Ch,Tr>& os,const C& c){
	os<<'[';
	for(auto i=begin(c);i!=end(c);++i)
		os<<(i==begin(c)?"":" ")<<*i;
	return os<<']';
}

constexpr int INF=1e9;
constexpr int MOD=1e9+7;
constexpr double EPS=1e-9;

enum:char{
	WALL='#',ME='@',PANEL='w',CONTAINER='c',EMPTY='.',ESCAPE='E'
};
constexpr int di[]={-1,1,0,0},dj[]={0,0,-1,1};

string encode(const vs& grid,int i,int j)
{
	int h=grid.size(),w=grid[0].size();
	string res;
	repi(k,1,h-1) res+=grid[k].substr(1,w-2);
	res[(i-1)*(w-2)+j-1]=ME;
	return res;
}

int main()
{
	for(int h,w;cin>>h>>w && h|w;){
		int gi=-1,gj=-1;
		deque<tuple<vs,int,int,int>> dq;
		{
			vs grid(h);
			rep(i,h) cin>>grid[i];
			rep(i,h) rep(j,w) if(grid[i][j]==ESCAPE){
				gi=i,gj=j;
				grid[i][j]=EMPTY;
			}
			rep(i,h) rep(j,w) if(grid[i][j]==ME){
				grid[i][j]=EMPTY;
				dq.emplace_back(grid,i,j,0);
			}
		}
		
		int res=-1;
		set<string> vis;
		while(dq.size()){
			vs cur; int ci,cj,ct; tie(cur,ci,cj,ct)=move(dq.front()); dq.pop_front();
			if(!vis.insert(encode(cur,ci,cj)).second) continue;
			
			if(ci==gi && cj==gj){
				res=ct;
				break;
			}
			
			rep(k,4){
				int ni=ci+di[k],nj=cj+dj[k];
				if(cur[ni][nj]==WALL || cur[ni][nj]==PANEL) continue;
				if(cur[ni][nj]==CONTAINER){
					int i=ni+di[k],j=nj+dj[k];
					for(;;i+=di[k],j+=dj[k]){
						if(cur[i][j]==EMPTY) continue;
						if(cur[i][j]==PANEL) break;
						if(cur[i][j]==WALL || cur[i][j]==CONTAINER){
							i-=di[k],j-=dj[k];
							break;
						}
					}
					if(i==ni && j==nj) continue;
					vs next=cur;
					next[ni][nj]=EMPTY;
					next[i][j]=next[i][j]==PANEL?EMPTY:CONTAINER;
					dq.emplace_front(move(next),ci,cj,ct);
				}
				else
					dq.emplace_back(cur,ni,nj,ct+1);
			}
		}
		cout<<res<<endl;
	}
}