#include <bits/stdc++.h>
int IntMaxVal = (int)1e20;
int IntMinVal = (int)-1e20;
long long LongMaxVal = (long long)1e20;
long long LongMinVal = (long long)-1e20;
using namespace std;
template <typename T>
struct argument_type;
template <typename T, typename U>
struct argument_type<T(U)> {};
template <typename T1, typename T2>
istream& operator>>(istream& is, pair<T1, T2>& s) {
  is >> s.first >> s.second;
  return is;
}
template <typename T>
ostream& operator<<(ostream& os, const vector<T>& v) {
  for (int i = 0; i < v.size(); i++) os << v[i] << ' ';
  os << '\n';
  ;
  return os;
}
template <typename T1, typename T2>
ostream& operator<<(ostream& s, pair<T1, T2>& t) {
  s << t.first << ' ' << t.second;
  return s;
}
deque<int> getRow(int n) {
  if (n == 1) {
    deque<int> res(1, 1);
    return res;
  } else {
    deque<int> res;
    int sq = 2;
    while (sq * sq <= n) sq++;
    sq--;
    for (int i = 0; i < sq * sq; ++i) res.push_back(13);
    while (res.size() < n) {
      auto x = res.front();
      res.pop_front();
      if (x == 3 || x == 4 || x == 12)
        res.push_back(x);
      else if (x == 13) {
        res.push_back(12);
        res.push_front(5);
      } else if (x == 5) {
        res.push_back(3);
        res.push_back(4);
      }
    }
    return res;
  }
}
int main() {
  srand(time(NULL));
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  int n;
  cin >> n;
  ;
  int m;
  cin >> m;
  ;
  auto r2 = getRow(m);
  vector<int> row(r2.begin(), r2.end());
  auto c2 = getRow(n);
  vector<int> col(c2.begin(), c2.end());
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < m; ++j) cout << row[j] * col[i] << ' ';
    cout << '\n';
    ;
  }
}
