#include <bits/stdc++.h>
#define GET_MACRO(_1,_2,_3,_4,_5,_6,_7,_8,NAME,...) NAME
#define pr(...) cerr<< GET_MACRO(__VA_ARGS__,pr8,pr7,pr6,pr5,pr4,pr3,pr2,pr1)(__VA_ARGS__) <<endl
#define pr1(a) (#a)<<"="<<(a)<<" "
#define pr2(a,b) pr1(a)<<pr1(b)
#define pr3(a,b,c) pr1(a)<<pr2(b,c)
#define pr4(a,b,c,d) pr1(a)<<pr3(b,c,d)
#define pr5(a,b,c,d,e) pr1(a)<<pr4(b,c,d,e)
#define pr6(a,b,c,d,e,f) pr1(a)<<pr5(b,c,d,e,f)
#define pr7(a,b,c,d,e,f,g) pr1(a)<<pr6(b,c,d,e,f,g)
#define pr8(a,b,c,d,e,f,g,h) pr1(a)<<pr7(b,c,d,e,f,g,h)
#define prArr(a) {cerr<<(#a)<<"={";int i=0;for(auto t:(a))cerr<<(i++?", ":"")<<t;cerr<<"}"<<endl;}
using namespace std;
using Int = long long;
using _int = int;
using ll = long long;
using Double = long double;
const Int INF = (1LL<<60)+1e9; // ~ 1.15 * 1e18
const Int mod = (1e9)+7;
const Double EPS = 1e-8;
const Double PI = 6.0 * asin((Double)0.5);
using P = pair<Int,Int>;
template<class T> T Max(T &a,T b){return a=max(a,b);}
template<class T> T Min(T &a,T b){return a=min(a,b);}
template<class T1, class T2> ostream& operator<<(ostream& o,pair<T1,T2> p){return o<<"("<<p.first<<","<<p.second<<")";}
template<class T1, class T2, class T3> ostream& operator<<(ostream& o,tuple<T1,T2,T3> t){
  return o<<"("<<get<0>(t)<<","<<get<1>(t)<<","<<get<2>(t)<<")";}
template<class T1, class T2> istream& operator>>(istream& i,pair<T1,T2> &p){return i>>p.first>>p.second;}
template<class T> ostream& operator<<(ostream& o,vector<T> a){Int i=0;for(T t:a)o<<(i++?" ":"")<<t;return o;}
template<class T> istream& operator>>(istream& i,vector<T> &a){for(T &t:a)i>>t;return i;}

class UF{
public:
  int V;
  vector<int> par,rnk,sz;
  UF(){}
  UF(int V):V(V),par(V),rnk(V,0),sz(V,1){for(int i=0;i<V;i++)par[i]=i;}
  
  int find(int x){
    assert(x < V);
    if(par[x]==x)return x;
    return par[x]=find(par[x]);
  }
  
  void unite(int x,int y){
    x=find(x), y=find(y);
    if(x==y)return;
    if(x > y)par[x]=y, sz[y] += sz[x];
    else{
      par[y]=x;
      sz[x] += sz[y];
      if(rnk[x]==rnk[y])rnk[x]++;
    }
  }

  bool same(int x,int y){return find(x)==find(y);}

  int size(int x){return sz[find(x)];}
};

vector<string> rot90(const vector<string> &v){
  int h = v.size(), w = v[0].size();
  vector<string> res(w,string(h,'.'));
  for(int i=0;i<h;i++) for(int j=0;j<w;j++) res[j][h-i-1] = v[i][j];
  return res;
}

int h, w, n;
vector<vector<string> >mp;
int getIdx(int y,int x){return w * (w - 1 - x) + y;}

vector<int> getNext(vector<int> par, vector<string> &mp){

  assert((int)par.size() == h);
  vector<vector<int> > num(h, vector<int>(w));
  for(int i=0;i<h;i++)
    for(int j=0;j<w;j++) num[i][j] = getIdx(i, j) + h + 1;

  for(int i=0;i<h;i++) if(par[i] != -1) num[i][0] = par[i];
  
  UF uf(h * w + h + 1);
  for(int i=0;i<h;i++){
    for(int j=0;j<w;j++){
      if(mp[i][j] == '#') continue;
      if(i + 1 < h && mp[i+1][j] != '#') uf.unite(num[i][j], num[i+1][j]);
      if(j + 1 < w && mp[i][j+1] != '#') uf.unite(num[i][j], num[i][j+1]);
    }
  }

  for(int i=0;i<h;i++)
    for(int j=0;j<w;j++) num[i][j] = uf.find(num[i][j]);
  //for(int i=0;i<h;i++) pr(mp[i]);
  //for(int i=0;i<w;i++) pr(i, num[i]);


  vector<int> res(h, -1);
  vector<int> used(w * h + h + 1, -1);
  int cnt = 1;
  for(int i=0;i<h;i++){
    if(mp[i][w-1] == '#') continue;
    int p = num[i][w-1];
    if(p == 0) res[i] = 0;
    else if(used[p] != -1) res[i] = used[p];
    else res[i] = used[p] = cnt++;
  } 
  return res;
}

int check(vector<int> &par){
  for(int i=0;i<h;i++) if(par[i] == 0) return 1;
  return 0;
}

vector<map<vector<int>, int> >mem;
int dfs(int idx, vector<int> par){
  //pr(idx, par);
  if(check(par) == false) return 0;
  if(idx == n) return 1;
  if(mem[idx].count(par)) return mem[idx][par];
  
  int res = false;
  auto tmp = mp[idx];
  for(int i=0;i<4;i++){
    if(res) break;
    tmp = rot90(tmp);
    auto npar = getNext(par, tmp);
    res |= dfs(idx+1, npar);
  }
  return mem[idx][par] = res;
}

signed main(){
  srand((unsigned)time(NULL));
  cin.tie(0);
  ios_base::sync_with_stdio(0);
  cout << fixed << setprecision(12);
  while(1){
    cin>>h>>n;
    w = h;
    
    if( h == 0 && w == 0) break;
    mp.clear();
    mp.resize(n, vector<string>(h));
    cin>>mp;

    mem.clear();
    mem.resize(n);
    int ans = dfs(0, vector<int>(h, 0));
    cout<<(ans? "Yes":"No")<<endl;
  }
  return 0;
}



Measured memory_bytes: 5204