/*
  Compete against Yourself.
  Author - Aryan (@aryanc403)
*/
/*
  Credits -
  Atcoder library - https://atcoder.github.io/ac-library/production/document_en/ (namespace atcoder)
  Github source code of library - https://github.com/atcoder/ac-library/tree/master/atcoder
  https://codeforces.com/contest/4/submission/150120627
*/

#ifdef ARYANC403
    #include <header.h>
#else
    #pragma GCC optimize ("Ofast")
    //#pragma GCC target ("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx")
    #pragma GCC target ("sse,sse2,mmx")
    #pragma GCC optimize ("-ffloat-store")
    #include <bits/stdc++.h>
    #include <ext/pb_ds/assoc_container.hpp>
    #include <ext/pb_ds/tree_policy.hpp>
    #define dbg(args...) 42;
    // #define endl "\n"
#endif

// y_combinator from @neal template https://codeforces.com/contest/1553/submission/123849801
// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0200r0.html
template<class Fun> class y_combinator_result {
    Fun fun_;
public:
    template<class T> explicit y_combinator_result(T &&fun): fun_(std::forward<T>(fun)) {}
    template<class ...Args> decltype(auto) operator()(Args &&...args) { return fun_(std::ref(*this), std::forward<Args>(args)...); }
};
template<class Fun> decltype(auto) y_combinator(Fun &&fun) { return y_combinator_result<std::decay_t<Fun>>(std::forward<Fun>(fun)); }

using namespace std;
#define fo(i,n)   for(i=0;i<(n);++i)
#define repA(i,j,n)   for(i=(j);i<=(n);++i)
#define repD(i,j,n)   for(i=(j);i>=(n);--i)
#define all(x) begin(x), end(x)
#define sz(x) ((lli)(x).size())
#define eb emplace_back
#define X first
#define Y second

using lli = long long int;
using mytype = long double;
using ii = pair<lli,lli>;
using vii = vector<ii>;
using vi = vector<lli>;

template <class T>
using ordered_set =  __gnu_pbds::tree<T,__gnu_pbds::null_type,less<T>,__gnu_pbds::rb_tree_tag,__gnu_pbds::tree_order_statistics_node_update>;
// X.find_by_order(k) return kth element. 0 indexed.
// X.order_of_key(k) returns count of elements strictly less than k.

// namespace Re = std::ranges;
// namespace Ve = std::ranges::views;

const auto start_time = std::chrono::high_resolution_clock::now();
void aryanc403()
{
auto end_time = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> diff = end_time-start_time;
    cerr<<"Time Taken : "<<diff.count()<<"\n";
}

const lli INF = 0xFFFFFFFFFFFFFFFLL;
const lli SEED=chrono::steady_clock::now().time_since_epoch().count();
mt19937_64 rng(SEED);
inline lli rnd(lli l=0,lli r=INF)
{return uniform_int_distribution<lli>(l,r)(rng);}

class CMP
{public:
bool operator()(ii a , ii b) //For min priority_queue .
{    return ! ( a.X < b.X || ( a.X==b.X && a.Y <= b.Y ));   }};

void add( map<lli,lli> &m, lli x,lli cnt=1)
{
    auto jt=m.find(x);
    if(jt==m.end())         m.insert({x,cnt});
    else                    jt->Y+=cnt;
}

void del( map<lli,lli> &m, lli x,lli cnt=1)
{
    auto jt=m.find(x);
    if(jt->Y<=cnt)            m.erase(jt);
    else                      jt->Y-=cnt;
}

bool cmp(const ii &a,const ii &b)
{
    return a.X<b.X||(a.X==b.X&&a.Y<b.Y);
}

using t4 = array<lli,4>;

const vii dr = {{0,1},{-1,0},{0,-1},{1,0}};

const vector<t4> rot = {
    {1,0,0,1},
    {0,-1,1,0},
    {-1,0,0,-1},
    {0,1,-1,0},
};

const lli MX = 207*207;
bool visited[MX];

int main(void) {
    ios_base::sync_with_stdio(false);cin.tie(NULL);
    // freopen("txt.in", "r", stdin);
    // freopen("txt.out", "w", stdout);
// cout<<std::fixed<<std::setprecision(35);
// Ve::iota(1, 6) | Ve::transform([](int x) { return x * 2; }) | Ve::reverse | Ve::take(3)
{
    lli R,C;
    cin>>R>>C;
    vector<string> a(R);
    for(auto &s:a)
        cin>>s;

    const lli N = R*C;

    vector<t4> dis(N);

    auto pre=[&]()->void{
        lli s=-1;

        s=find(all(dr),ii{0,1})-dr.begin();
        // dbg(s,dr[s]);
        assert(dr[s]==make_pair(0LL,1LL));

        for(lli i=R-1;i>=0;i--)
            for(lli j=C-1;j>=0;j--){
                if(a[i][j]=='#')
                    dis[i*C+j][s]=-1;
                else{
                    if(j+1<C)
                        dis[i*C+j][s]=1+dis[i*C+j+1][s];
                }
            }

        s=find(all(dr),ii{0,-1})-dr.begin();
        assert(dr[s]==make_pair(0LL,-1LL));
        for(lli i=R-1;i>=0;i--)
            for(lli j=0;j<C;j++){
                if(a[i][j]=='#')
                    dis[i*C+j][s]=-1;
                else{
                    if(j>0)
                        dis[i*C+j][s]=1+dis[i*C+j-1][s];
                }
            }

        s=find(all(dr),ii{1,0})-dr.begin();
        assert(dr[s]==make_pair(1LL,0LL));
        for(lli j=0;j<C;j++)
            for(lli i=R-1;i>=0;i--){
                if(a[i][j]=='#')
                    dis[i*C+j][s]=-1;
                else{
                    if(i+1<R)
                        dis[i*C+j][s]=1+dis[i*C+j+C][s];
                }
            }

        s=find(all(dr),ii{-1,0})-dr.begin();
        assert(dr[s]==make_pair(-1LL,0LL));
        for(lli j=0;j<C;j++)
            for(lli i=0;i<R;i++){
                if(a[i][j]=='#')
                    dis[i*C+j][s]=-1;
                else{
                    if(i>0)
                        dis[i*C+j][s]=1+dis[i*C+j-C][s];
                }
            }
    };

    pre();

    lli curX=0,curY=0,curDr = 1,qurCnt = 0;

#ifdef ARYANC403
    const bool ask = false;
#else
    const bool ask = true;
#endif


    lli lstDist=-1;

    auto getDist = [&]()->lli{
        if(ask){
            lli d;
            cin>>d;
            lstDist=d;
        } else {
            lstDist=dis[curX*C+curY][curDr];
        }
        return lstDist;
    };

    auto moveLeft=[&]()->void{
        qurCnt++;
        if(ask)
            cout<<"left"<<endl;
        else {
            curDr++;
            curDr%=4;
            // dbg("rot",curX,curY,curDr);
        }
        lstDist=getDist();
    };

    auto moveFwd=[&]()->void{
        qurCnt++;
        // dbg(curX,curY,curDr,dr[curDr],lstDist);
        if(ask)
            cout<<"step"<<endl;
        else {
            curX+=dr[curDr].X;
            curY+=dr[curDr].Y;
            // dbg("move",curX,curY,curDr);
            assert(0<=curX&&curX<R);
            assert(0<=curY&&curY<C);
            assert(a[curX][curY]=='.');
        }
        lstDist=getDist();
    };

    const t4 def = t4{-2,-2,-2,-2};
    vector<t4> responses(MX,def);
    auto runDfs = [&]()->void{
        responses.clear();
        responses.resize(MX,def);
        memset(visited,0,sizeof(visited));
        getDist();
        lli cnt = 0;
        lli dire = 0,dxe=0,dye=0;
        y_combinator([&](const auto &self,const lli dx,const lli dy)->void{
            cnt++;
            // dbg("currently at",dx,dy,dire,cnt,"|",curX,curY,curDr);
            const lli idx = (dx+102)*205+(dy+102);
            assert(!visited[idx]);

            visited[idx]=true;
            for(const auto &it:{0,1,2,3}){
                const lli d=lstDist,curd=dire;
                responses[idx][dire]=d;
                // dbg(curX,curY,curDr,d);
                assert(d>=0);
                if(d){
                    const lli bx=dx+dr[dire].X,by=dy+dr[dire].Y;
                    const lli ci = (bx+102)*205+(by+102);
                    if(!visited[ci]){
                        dxe+=dr[dire].X;
                        dye+=dr[dire].Y;
                        moveFwd();
                        self(bx,by);
                    }
                    assert(dxe==dx&&dye==dy&&dire==curd);
                }

                moveLeft();
                dire++;
                dire%=4;
            }

            if(dx||dy){
                for(const lli &it:{0,1}){
                    moveLeft();
                    dire++;
                    dire%=4;
                }

                dxe+=dr[dire].X;
                dye+=dr[dire].Y;
                moveFwd();
                for(const lli &it:{0,1}){
                    moveLeft();
                    dire++;
                    dire%=4;
                }
            }

            // dbg("returning at",dx,dy);
        })(0LL,0LL);

        qurCnt++;
        // cerr<<qurCnt<<endl;
        assert(qurCnt<=100000);
    };

    runDfs();
    const auto juryResponse = responses;

    lli juryVisitedCells = 0;
    for(const auto &v:juryResponse){
        bool gl=false;
        for(const auto &x:v)
            if(x>=0)
                gl=true;
        if(gl)
            juryVisitedCells++;
    }

    auto runDfs2 = [&](const lli sx,const lli sy,const lli sd)->bool{
        // dbg("runDfs2",sx,sy,sd);
        memset(visited,0,sizeof(visited));
        bool isValid = true;
        lli curVisited = 0;
        y_combinator([&](const auto &self,const lli dx,const lli dy)->void{
            if(!isValid)
                return;
            const lli idx = (dx+102)*205+(dy+102);
            assert(!visited[idx]);
            visited[idx]=true;
            curVisited++;
            for(const auto &it:{0,1,2,3}){
                const lli ogX=sx+rot[sd][0]*dx+rot[sd][1]*dy;
                const lli ogY=sy+rot[sd][2]*dx+rot[sd][3]*dy;
                assert(0<=ogX&&ogX<R);
                assert(0<=ogY&&ogY<C);
                const lli d=dis[ogX*C+ogY][(it+sd+16)%4];
                if(d!=juryResponse[idx][it]){
                    isValid=false;
                    break;
                }
                assert(d>=0);
                if(d){
                    const lli bx=dx+dr[it].X,by=dy+dr[it].Y;
                    const lli ci = (bx+102)*205+(by+102);
                    if(!visited[ci])
                        self(bx,by);
                }
            }
        })(0LL,0LL);
        if(curVisited!=juryVisitedCells)
            isValid=false;
        return isValid;
    };

    set<ii> validRes;

    auto mockRun=[&](const lli i,const lli j,const lli d)->void{
        if(sz(validRes)>=2)
            return;
        if(validRes.count(ii{i,j}))
            return;
        if(runDfs2(i,j,d))
            validRes.insert(ii{i,j});
    };

    for(lli i=0;i<R;i++)
        for(lli j=0;j<C;j++)
            for(lli d=0;d<4;d++){
                if(a[i][j]=='.')
                    mockRun(i,j,d);
            }
    dbg(validRes);
    if(sz(validRes)==1){
        const auto p=*validRes.begin();
        cout<<"yes "<<p.X+1<<" "<<p.Y+1<<endl;
    } else {
        assert(sz(validRes)>=2);
        cout<<"no"<<endl;
    }

}   aryanc403();
    return 0;
}